详解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中列表、字典、元组、集合数据结构整理
Nov 20 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
python把1变成01的步骤总结
Feb 27 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
django模型类中,null=True,blank=True用法说明
Jul 09 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
python制作抽奖程序代码详解
Jan 15 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 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
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
js回调函数仿360开机
2019/12/26 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
Python实现二叉搜索树
2016/02/03 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python实现共轭梯度法
2019/07/03 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
刚毕业大学生自荐信范文
2014/02/20 职场文书
供货协议书范本
2014/04/22 职场文书
5s推行计划书
2014/05/06 职场文书
小浪底导游词
2015/02/12 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL