详解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闭包实现计数器的方法
May 05 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python动态生成多维数组的方法示例
Aug 09 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
python中函数返回多个结果的实例方法
Dec 16 Python
pytorch中的numel函数用法说明
May 13 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
通过html表格发电子邮件
2006/10/09 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
Python实现的检测网站挂马程序
2014/11/30 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python之re操作方法(详解)
2017/06/14 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
优秀教师先进事迹
2014/01/22 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
师范大学生求职信
2014/06/13 职场文书
年终工作总结范文2014
2014/11/27 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
如何撰写创业策划书
2019/06/27 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
SQL注入详解及防范方法
2021/12/06 MySQL
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS