详解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局部赋值的规则
Mar 07 Python
python基础教程之lambda表达式使用方法
Feb 12 Python
用python删除java文件头上版权信息的方法
Jul 31 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python利用lxml读写xml格式的文件
Aug 10 Python
python2.7和NLTK安装详细教程
Sep 19 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Python requests上传文件实现步骤
Sep 15 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
Python创建文件和追加文件内容实例
2014/10/21 Python
解决Python requests 报错方法集锦
2017/03/19 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
PyTorch中的Variable变量详解
2020/01/07 Python
python如何绘制疫情图
2020/09/16 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
数控专业推荐信范文
2013/12/02 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
农业项目建议书
2014/08/25 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
趣味运动会赞词
2015/07/22 职场文书