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. You have to judge from the encoding format. The method is as follows:
1.mp3 encoding
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, which expands the information capacity of ID3V1. |
Frame
. . . Frame |
A series of frames, the number is determined by the file size and frame lengthEach FRAME The length may not be fixed, or it may be fixed, and is determined by the bitrate.Each FRAME is divided into two parts: frame header and data entityThe frame header records the bitrate and sampling of mp3 Rate, version and other information, each frame is independent of each other. |
ID3V1 | Contains author, composer, album and other information, and is 128 BYTE in length. |
# 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;