Maison >développement back-end >Tutoriel Python >Explication détaillée du jugement du format mp3 à l'aide de Python

Explication détaillée du jugement du format mp3 à l'aide de Python

高洛峰
高洛峰original
2017-02-23 16:36:041964parcourir

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.

ID3V2

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

Frame

.

.

.

Frame

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

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

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

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

ID3V1

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

Cadre

.


.

# coding: utf-8

&#39;&#39;&#39;
@author: BigFengFeng
@time: 16/12/21 下午6:10
@license: Apache Licence
@description:

&#39;&#39;&#39;

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__ == &#39;__main__&#39;:
 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


Chaque FRAME est divisée en deux parties : l'en-tête de la trame et l'entité de données

La trame l'en-tête enregistre les bits du débit mp3, du taux d'échantillonnage, de la version et d'autres informations, chaque image est indépendante les unes des autres.

ID3V1

Contient l'auteur, le compositeur, l'album et d'autres informations, et mesure 128 octets.

En d'autres termes, sur la base des informations de début dans les trois structures de TAG_V2 (ID3V2), de données audio et de TAG_V1 (ID3V1), vous pouvez déterminer S'agit-il d'un fichier codé en mp3 ? 2.code pythonCe qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile. à l'étude de tout le monde, j'espère également que tout le monde soutiendra le site Web PHP chinois. Pour des explications plus détaillées sur le jugement du format mp3 à l'aide de Python, veuillez faire attention au site Web PHP chinois !
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn