详解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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
Python中的集合介绍
Jan 28 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
如何在Django项目中引入静态文件
Jul 26 Python
Python log模块logging记录打印用法解析
Jan 20 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
Python实现CAN报文转换工具教程
May 05 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
python ssh 执行shell命令的示例
Sep 29 Python
python tkinter实现连连看游戏
Nov 16 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教程之phpize使用方法
2014/02/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
php支付宝APP支付功能
2020/07/29 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python中私有函数调用方法解密
2016/04/29 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
python分数表示方式和写法
2019/06/26 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
教师新年寄语
2014/04/03 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技