详解python进行mp3格式判断


Posted in Python onDecember 23, 2016

项目中使用mp3格式进行音效播放,遇到一个mp3文件在程序中死活播不出声音,最后发现它是wav格式的文件,却以mp3结尾。要对资源进行mp3格式判断,那么如何判断呢,用.mp3后缀肯定不靠谱,得从编码格式判断,方法如下:

1.mp3编码

MP3文件是一种流媒体文件格式,所以没有文件头。像AVI、WAV这种有文件头的格式,很好判断,他们都是RIFF开头的,只要进行RIFF字符串对比,就可以查出是否是AVI、WAV,而mp3就只能分析编码格式了。这里大概说mp3编码规则一下,详细的可用参考这篇文章

MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)

a). ID3V2 在文件开始的位置,以ID3开头,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量,非必需

b). 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定;每个帧都以FFF开头,的长度可能不固定,也可能固定,由位率bitrate决定;每个帧又分为帧头和数据实体两部分;帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立 。

c). ID3V1在文件结尾的位置,以TAG开头,包含了作者,作曲,专辑等信息,长度为128Byte,非必须。

ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。
Frame . . . Frame 一系列的帧,个数由文件大小和帧长决定 每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定 每个FRAME又分为帧头和数据实体两部分 帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。
ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE。 

 也就是说,根据TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)三结构中的开头信息,便可以判断出是不是mp3编码的文件。

2.python代码

# coding: utf-8

'''
@author: BigFengFeng
@time: 16/12/21 下午6:10
@license: Apache Licence
@description:

'''

import os

#mp3filePath是否是mp3格式的
def isMp3Format(mp3filePath):
 #读取文件内字符串
 f = open(mp3filePath, "r");
 fileStr = f.read();
 f.close();
 head3Str = fileStr[:3];

 #判断开头是不是ID3
 if head3Str == "ID3":
  return True;

 #判断结尾有没有TAG
 last32Str = fileStr[-32:];
 if last32Str[:3] == "TAG":
  return True;

 #判断第一帧是不是FFF开头, 转成数字
 # fixme 应该循环遍历每个帧头,这样才能100%判断是不是mp3
 ascii = ord(fileStr[:1]);
 if ascii == 255:
  return True;

 return False;


#遍历folderPath看看是不是都是mp3格式的,
#是就true,不是就是false, 并返回是mp3的list,不是MP3的list
def isMp3FolderTraverse(folderPath):
 mp3List = [];
 notMp3List = [];
 isAllMpFormat = True;
 for dirpath, dirnames, filenames in os.walk(folderPath):
  for filename in filenames:
   path = dirpath + os.sep + filename;
   isMp3 = isMp3Format(path);
   #判断是不是mp3结尾的 并且 是mp3格式的
   if isMp3 == False and str.endswith(path, ".mp3") == True:
    # print("--warning: file " + path + " is not mp3 format!--");
    notMp3List.append(path);
    isAllMpFormat = False;
   else:
    mp3List.append(path);
 return isAllMpFormat, mp3List, notMp3List;


if __name__ == '__main__':
 isMp3Format("s_com_click1.mp3");
 isAllMp3, mp3List, notMp3List = isMp3FolderTraverse("sound");
 print isAllMp3;
 print mp3List;
 print notMp3List;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
解读Python中degrees()方法的使用
May 18 Python
基于python实现微信模板消息
Dec 21 Python
Python正则表达式如何进行字符串替换实例
Dec 28 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
python绘制BA无标度网络示例代码
Nov 21 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
详解python发送各类邮件的主要方法
Dec 22 #Python
详解python 发送邮件实例代码
Dec 22 #Python
使用Python3 编写简单信用卡管理程序
Dec 21 #Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 #Python
详解python中的json的基本使用方法
Dec 21 #Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 #Python
python查看微信好友是否删除自己
Dec 19 #Python
You might like
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python tkinter界面居中显示的方法
2018/10/11 Python
python字符串循环左移
2019/03/08 Python
Python中super函数用法实例分析
2019/03/18 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
打架检讨书800字
2014/01/10 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
总账会计岗位职责
2015/04/02 职场文书
付款证明格式范文
2015/06/19 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
Python OpenGL基本配置方式
2022/05/20 Python
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL