Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der MP3-Formatbeurteilung mit Python
Im Projekt wird das MP3-Format für die Soundeffektwiedergabe verwendet. Wenn ich auf eine MP3-Datei stoße, die im Programm nicht abgespielt werden kann, stelle ich schließlich fest, dass es sich um eine Datei im WAV-Format handelt, die jedoch mit mp3 endet. Um das MP3-Format einer Ressource zu beurteilen, ist die Verwendung des .mp3-Suffixes definitiv unzuverlässig. Die Methode ist wie folgt:
1.mp3-Kodierung
MP3-Datei ist ein Streaming-Media-Dateiformat, daher gibt es keinen Dateiheader. Formatformate mit Dateiheadern wie AVI und WAV sind leicht zu beurteilen. Sie beginnen alle mit RIFF. Vergleichen Sie einfach die RIFF-Zeichenfolgen, um herauszufinden, ob es sich um AVI oder WAV handelt, während mp3 nur das Codierungsformat analysieren kann. Hier finden Sie eine kurze Einführung in die MP3-Kodierungsregeln. Weitere Informationen finden Sie in diesem Artikel
MP3-Dateien sind im Allgemeinen in drei Teile unterteilt: TAG_V2 (ID3V2), Audiodaten, TAG_V1 (ID3V1)
a) ID3V2 steht am Anfang der Datei, beginnend mit ID3, und enthält Informationen wie Autor, Komponist, Album usw. Die Länge ist nicht festgelegt, erweitert den Informationsumfang von ID3V1 und ist optional
b) Eine Reihe von Frames mit Audiodaten. In der Mitte der Datei wird die Anzahl durch die Dateigröße und die Framelänge bestimmt. Die Länge ist möglicherweise nicht festgelegt Jeder Frame ist in einen Frame-Header unterteilt. Der Frame-Header zeichnet die Bitrate, die Abtastrate, die Version und andere Informationen des MP3 auf, und jeder Frame ist unabhängig voneinander.
c). ID3V1 steht am Ende der Datei, beginnt mit TAG und enthält Informationen wie Autor, Komponist, Album usw. Die Länge beträgt 128 Byte und ist optional.
ID3V2
|
Enthält Informationen zu Autor, Komponist, Album und anderen Informationen. Die Länge ist nicht festgelegt, wodurch die Informationsmenge in ID3V1 erweitert wird. |
||||||
Rahmen . . # 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; . Frame |
Eine Reihe von Frames, deren Anzahl durch die Dateigröße und Framelänge bestimmt wird Die Länge jedes FRAMEs ist möglicherweise nicht oder nicht festgelegt und wird durch die Bitrate bestimmt |
||||||
ID3V1 |
Enthält Autor, Komponist, Album und andere Informationen und ist 128 Byte lang. |