Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der MP3-Formatbeurteilung mit Python

Detaillierte Erläuterung der MP3-Formatbeurteilung mit Python

高洛峰
高洛峰Original
2017-02-23 16:36:041969Durchsuche

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

ID3V2

包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。

Frame

.

.

.

Frame

一系列的帧,个数由文件大小和帧长决定

每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定

每个FRAME又分为帧头和数据实体两部分

帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。

ID3V1

包含了作者,作曲,专辑等信息,长度为128BYTE。 

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

Jeder FRAME ist in zwei Teile unterteilt: Frame-Header und DateneinheitDer Frame Der Header zeichnet die Bits der MP3-Rate, der Abtastrate, der Version und anderer Informationen auf, wobei jeder Frame unabhängig voneinander ist.

ID3V1

Enthält Autor, Komponist, Album und andere Informationen und ist 128 Byte lang.

Mit anderen Worten, basierend auf den Anfangsinformationen in den drei Strukturen TAG_V2 (ID3V2), Audiodaten und TAG_V1 (ID3V1), Sie können feststellen, ob es sich um eine MP3-codierte Datei handelt. 2.python-CodeDas Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, er wird hilfreich sein Ich hoffe auch, dass jeder die chinesische PHP-Website unterstützt. Ausführlichere Erläuterungen zur MP3-Formatbeurteilung mit Python finden Sie auf der chinesischen PHP-Website!
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn