详解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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python 多线程实现检测服务器在线情况
Nov 25 Python
Python解惑之整数比较详解
Apr 24 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
Python切片操作实例分析
Mar 16 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
用Python中的turtle模块画图两只小羊方法
Apr 09 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
python实现图片转字符画
Feb 19 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
angular2中使用第三方js库的实例
2018/02/26 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
python创建临时文件夹的方法
2015/07/06 Python
详解Django中的form库的使用
2015/07/18 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python 将md5转为16字节的方法
2018/05/29 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
python 中xpath爬虫实例详解
2019/08/26 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
C语言编程题
2015/03/09 面试题
疾病防治方案
2014/05/31 职场文书
工地材料员岗位职责
2015/04/11 职场文书
撤诉申请怎么写
2015/05/19 职场文书
防震减灾主题班会
2015/08/14 职场文书
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs