Maison  >  Article  >  développement back-end  >  Introduction à la méthode pour déterminer si une vidéo est au format mp3 à l'aide de python

Introduction à la méthode pour déterminer si une vidéo est au format mp3 à l'aide de python

巴扎黑
巴扎黑original
2017-08-18 17:10:172171parcourir

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 déterminer le format mp3 d'une ressource, comment le déterminer ? L'utilisation du suffixe .mp3 n'est définitivement pas fiable. Nous savons que l'extension peut être modifiée arbitrairement. Il faut juger à partir du format d'encodage.

  1. Encodage 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 des informations telles que l'auteur, le compositeur, l'album, etc. La longueur n'est pas fixe, augmentant la quantité d'informations d'ID3V1.

Cadre

.

.

.

Cadre

Une série de cadres dont le nombre est déterminé par le fichier Déterminé par la taille et la longueur de la trame

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 : en-tête de trame et entité de données

L'en-tête de trame enregistre le débit binaire, le taux d'échantillonnage, la version et d'autres informations du mp3, et 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 TAG_V2 (ID3V2), données audio et TAG_V1 (ID3V1), vous pouvez déterminer s'il s'agit d'un fichier encodé en mp3.

2.code python

# coding: utf-8
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;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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