Home >Backend Development >Python Tutorial >Introduction to the method of determining whether a video is in mp3 format using python
In the project, the mp3 format is used for sound effect playback. When an mp3 file is encountered, the sound cannot be played in the program. Finally, it is found that it is a file in wav format, but ends with mp3. To determine the mp3 format of a resource, how to determine it? Using the .mp3 suffix is definitely unreliable. We know that the extension can be modified arbitrarily. We have to judge from the encoding format. The method is as follows:
MP3 file is a streaming media file format, so there is no file header. Format formats with file headers such as AVI and WAV are easy to judge. They all start with RIFF. Just compare the RIFF strings to find out whether they are AVI or WAV, while mp3 can only analyze the encoding format. Here is a brief introduction to the mp3 encoding rules. For detailed information, please refer to this article
MP3 files are generally divided into three parts: TAG_V2(ID3V2), audio data, TAG_V1(ID3V1)
a). ID3V2 is at the beginning of the file, starting with ID3, and contains information such as author, composer, album, etc. The length is not fixed, extending the amount of information of ID3V1, and is optional
b). A series of frames of audio data , in the middle of the file, the number is determined by the file size and frame length; each frame starts with FFF, the length may not be fixed, or may be fixed, determined by the bitrate; each frame is divided into a frame header and There are two parts of the data entity; the frame header records the bit rate, sampling rate, version and other information of the mp3, and each frame is independent of each other.
c). ID3V1 is located at the end of the file, starting with TAG, and contains author, composer, album and other information. The length is 128Byte and is optional.
ID3V2
Contains author, composer, album and other information, the length is not fixed, expanding the amount of information of ID3V1.
Frame
.
.
.
Frame
A series of frames, the number is determined by the file Determined by size and frame length
The length of each FRAME may not be fixed, or may be fixed, and is determined by the bitrate
Each FRAME is divided into two parts: frame header and data entity
The frame header records the bit rate, sampling rate, version and other information of mp3, and each frame is independent of each other.
ID3V1
Contains author, composer, album and other information, and is 128BYTE in length.
In other words, based on the beginning information in the three structures of TAG_V2 (ID3V2), audio data, and TAG_V1 (ID3V1), you can determine whether it is an mp3-encoded file.
# 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;
The above is the detailed content of Introduction to the method of determining whether a video is in mp3 format using python. For more information, please follow other related articles on the PHP Chinese website!