2015-01-02 8 views
2

오디오 또는 비디오 파일에서 메타 데이터를 가져 와서 데이터베이스 레코드에 저장하는 것이 지금까지 유일한 방법입니다 이 AVCONV subprocess.Open 호출을 누른 다음 해당 파일을 읽는 파일을 사용하여 저장하려면 일부 단계를 저장하려면이 일을 할 수있는 라이브러리 무엇입니까? 나는 Pydub 또는 PySox로 그것을 할 수있는 방법을 찾지 못했습니다. 여기에 내가 사용하는 단순한 hamfisted 초보자 코드가 있는데, 비트 레이트, 지속 시간 등의 정보를 변수 audio_info에 넣고 메타 데이터를 메타 데이터에 넣습니다. OGG 출력은 ​​내가 테스트 한 다른 형식과 다르게 작동했습니다 (비디오 및 오디오 톤이었습니다!).어떻게 파이썬의 오디오/비디오 파일에서 메타 데이터와 비트 전송률 정보를 추출 할 수 있습니까?

try: 
      p = subprocess.Popen(["avconv" , "-i" , music_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
      out, err = p.communicate() 
      retcode = p.wait() 
    except IOError,e: 
      pass 
    extension = uploaded_music_file[-3:] 
    if "ogg" not in [err , extension]: 
      if "Metadata:" in err: 
        list = err.split("Metadata:") 
        holder = list[1].split("Duration:") 
        metadata = holder[0] 
        audio_info = holder[1].replace("At least one output file must be specified","") 
        print metadata 
        print audio_info 
      else: 
        list = err.split("Duration:") 
        audio_info = list[1].replace("At least one output file must be specified","") 
        print "No Metadata" 
        print audio_info 
    else: 
      list = err.split("Duration:") 
      if "Metadata:" in list[1]: 
        data = list[1].split("Metadata:") 
        metadata = data[1].replace("At least one output file must be specified","") 
        audio_info = data[0] 
        print metadata 
        print audio_info 
      else: 
        audio_info = list[1].replace("At least one output file must be specified","") 
        print "No Metadata" 
        print audio_info 
if (audio_info): 
      print "AUDIO INFO:" 
      cursor.execute("UPDATE songDB SET audio_info = %s WHERE id = %s" ,[ audio_info , song_id ]) 
      if (metadata): 
        print "METADATA:" 
        cursor.execute("songDB pack_song SET metadata = %s WHERE id = %s" ,[ metadata , song_id ]) 
+0

@ Oz123은 실제로 함께 작동하는 코드를 추가했습니다. - 출력이 꽤 janky –

답변

3

Pydub 는 pydub 만 오디오 파일을 처리하도록 설계되어 있지만는, 메타 데이터, pydub.utils.mediainfo("/path/to/file")를 검색하는 기능을 포함한다. 그러나 mediainfo의 현재 구현은 오디오 관련 작업을 수행하지 않는 것으로 보입니다.

는 FFmpeg/libav (특히 ffprobe/avprobe 유틸리티)

>>> from pydub.utils import mediainfo 
>>> mediainfo("/path/to/file.mp3") 

pydub의 단위 테스트에서 사용하는 test1.mp3 파일의 반환에 의해 제공된 그것의 메타 데이터 사전을 반환

:

{ 
    u'DISPOSITION': { 
    u'attached_pic': u'0', 
    u'clean_effects': u'0', 
    u'comment': u'0', 
    u'default': u'0', 
    u'dub': u'0', 
    u'forced': u'0', 
    u'hearing_impaired': u'0', 
    u'karaoke': u'0', 
    u'lyrics': u'0', 
    u'original': u'0', 
    u'visual_impaired': u'0' 
    }, 
    u'TAG': {u'encoder': u'Lavf55.12.100'}, 
    u'avg_frame_rate': u'0/0', 
    u'bit_rate': u'96179', 
    u'bits_per_sample': u'0', 
    u'channel_layout': u'stereo', 
    u'channels': u'2', 
    u'codec_long_name': u'MP3 (MPEG audio layer 3)', 
    u'codec_name': u'mp3', 
    u'codec_tag': u'0x0000', 
    u'codec_tag_string': u'[0][0][0][0]', 
    u'codec_time_base': u'1/32000', 
    u'codec_type': u'audio', 
    u'duration': u'10.044000', 
    u'duration_ts': u'141740928', 
    u'filename': u'/Users/jiaaro/Documents/code/pydub/test/data/test1.mp3', 
    u'format_long_name': u'MP2/3 (MPEG audio layer 2/3)', 
    u'format_name': u'mp3', 
    u'id': u'N/A', 
    u'index': u'0', 
    u'max_bit_rate': u'N/A', 
    u'nb_frames': u'N/A', 
    u'nb_programs': u'0', 
    u'nb_read_frames': u'N/A', 
    u'nb_read_packets': u'N/A', 
    u'nb_streams': u'1', 
    u'probe_score': u'51', 
    u'profile': u'unknown', 
    u'r_frame_rate': u'0/0', 
    u'sample_fmt': u's16p', 
    u'sample_rate': u'32000', 
    u'size': u'120753', 
    u'start_pts': u'487305', 
    u'start_time': u'0.034531', 
    u'time_base': u'1/14112000' 
} 
+0

Pydub가 우수합니다! 태그를 포함하는 alac 파일을 변환하고 OnLiner가 두 개의 mp3 : AudioSegment.from_file (src) .export (dst, format = 'mp3', tags = mediainfo (src) [ 'TAG']) – Toby