详解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实现2014火车票查询代码分享
Jan 10 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python算法表示概念扫盲教程
Apr 13 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
基于Django用户认证系统详解
Feb 21 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
Python中的元组介绍
Jan 28 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
Python实现括号匹配方法详解
Feb 10 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 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
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
js 操作css实现代码
2009/06/11 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python 切换root 执行命令的方法
2019/01/19 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
flask项目集成swagger的方法
2020/12/09 Python
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
统计员岗位职责范本
2015/04/14 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技