Maison >développement back-end >Tutoriel Python >Explication détaillée du jugement du format mp3 à l'aide de Python
Dans le projet, le format mp3 est utilisé pour la lecture des effets sonores. Lorsque je rencontre un fichier mp3 qui ne peut pas être lu dans le programme, je découvre finalement qu'il s'agit d'un fichier au format wav, mais qui se termine par mp3. Pour juger le format mp3 d'une ressource, comment la juger ? L'utilisation du suffixe .mp3 n'est définitivement pas fiable. Il faut juger à partir du format d'encodage. La méthode est la suivante :
<.>Encodage 1.mp3
Le fichier MP3 est un format de fichier multimédia en streaming, il n'y a donc pas d'en-tête de fichier. Les formats de format avec des en-têtes de fichiers tels que AVI et WAV sont faciles à juger. Ils commencent tous par RIFF. Il suffit de comparer les chaînes RIFF pour savoir si elles sont AVI ou WAV, tandis que mp3 ne peut analyser que le format d'encodage. Voici une brève introduction aux règles d'encodage mp3. Pour des informations détaillées, veuillez vous référer à cet article Les fichiers MP3 sont généralement divisés en trois parties : TAG_V2 (ID3V2), données audio, TAG_V1 (ID3V1)a). ID3V2 est au début du fichier, commençant par ID3, et contient des informations telles que l'auteur, le compositeur, l'album, etc. La longueur n'est pas fixe, étendant la quantité d'informations de ID3V1, et est facultative b) Une série d'images de données audio, au milieu du fichier, le nombre est déterminé par la taille du fichier et la longueur de l'image ; chaque image commence par FFF, la longueur peut ne pas être fixe, ou peut être être fixe, déterminé par le débit ; chaque trame est divisée en un en-tête de trame et il y a deux parties de l'entité de données qui enregistrent le débit binaire, le taux d'échantillonnage, la version et d'autres informations du mp3, et chaque trame est indépendante ; les uns des autres. c). ID3V1 se trouve à la fin du fichier, commençant par TAG, et contient des informations telles que l'auteur, le compositeur, l'album, etc. La longueur est de 128 octets et est facultative.
ID3V2 |
Contient l'auteur, le compositeur, l'album et d'autres informations, la longueur n'est pas fixe, augmentant la quantité d'informations dans ID3V1.
|
||||||
Cadre .# 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 |
Une série d'images, le nombre est déterminé par la taille du fichier et la longueur de l'image La longueur de chaque FRAME peut ne pas être fixe, ou peut être fixe, et est déterminée par le débit
|
||||||
ID3V1 |
Contient l'auteur, le compositeur, l'album et d'autres informations, et mesure 128 octets. |