>백엔드 개발 >파이썬 튜토리얼 >Python을 사용하여 비디오가 mp3 형식인지 확인하는 방법 소개

Python을 사용하여 비디오가 mp3 형식인지 확인하는 방법 소개

巴扎黑
巴扎黑원래의
2017-08-18 17:10:172258검색

프로젝트에서는 효과음 재생을 위해 mp3 형식을 사용하고 있는데, 프로그램에서 mp3 파일을 재생할 수 없는 경우, 최종적으로 wav 형식의 파일인데 mp3로 끝나는 것으로 확인됩니다. 리소스의 mp3 형식을 결정하려면 어떻게 해야 합니까? .mp3 접미사를 사용하는 것은 확실히 신뢰할 수 없습니다. 확장자가 임의로 수정될 수 있으므로 인코딩 형식으로 판단해야 합니다.

  1. mp3 인코딩

MP3 파일은 스트리밍 미디어 파일 형식이므로 파일 헤더가 없습니다. AVI 및 WAV와 같은 파일 헤더가 있는 형식은 모두 RIFF로 시작합니다. RIFF 문자열을 비교하면 AVI인지 WAV인지 알 수 있지만 mp3는 인코딩 형식만 분석할 수 있습니다. mp3 인코딩 규칙에 대한 간략한 소개는 이 글을 참고해주세요

MP3 파일은 크게 TAG_V2(ID3V2), 오디오 데이터, TAG_V1(ID3V1)

a) 세 부분으로 나뉩니다. 파일 시작 부분에는 ID3으로 시작하여 작가, 작곡가, 앨범 등의 정보가 포함되어 있습니다. 길이는 고정되어 있지 않으므로 ID3V1의 정보 내용이 확장되므로 필요하지 않습니다

b). 오디오 데이터의 프레임 수는 파일 크기와 프레임 길이에 따라 결정됩니다. 각 프레임은 FFF로 시작하며 길이는 고정되지 않거나 각 프레임에 따라 고정될 수 있습니다. 프레임 헤더와 데이터 엔터티의 두 부분으로 나누어집니다. 프레임 헤더는 mp3 속도, 샘플링 속도, 버전 및 기타 정보의 비트를 기록하며 각 프레임은 서로 독립적입니다.

c) ID3V1은 파일 끝부분에 TAG로 시작하며 작가, 작곡가, 앨범 등의 정보를 담고 있습니다. 길이는 128Byte이며 선택사항입니다.

ID3V2

에는 작가, 작곡가, 앨범 및 기타 정보가 포함되어 있으며 길이는 고정되어 있지 않아 ID3V1의 정보량을 확장합니다.

Frame

.

.

.

Frame

프레임의 연속으로, 개수는 파일 크기와 프레임 길이에 따라 결정됩니다.

각 FRAME의 길이는 고정되어 있지 않거나 고정되어 있을 수 있습니다. , 비트 전송률 결정에 따라 결정

각 프레임은 프레임 헤더와 데이터 엔터티의 두 부분으로 나뉩니다

프레임 헤더는 mp3의 비트 전송률, 샘플링 속도, 버전 및 기타 정보를 기록하며 각 프레임은 서로 독립적입니다.

ID3V1

에는 작가, 작곡가, 앨범 및 기타 정보가 포함되며 길이는 128BYTE입니다.

즉, TAG_V2(ID3V2), 오디오 데이터, TAG_V1(ID3V1) 3가지 구조의 시작 정보를 기반으로 mp3 인코딩 파일인지 여부를 판단할 수 있습니다.

2.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;

위 내용은 Python을 사용하여 비디오가 mp3 형식인지 확인하는 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.