3

私がやりたいことは、オーディオまたはビデオ ファイルからメタデータを取得し、それをデータベース レコードに保存することです。これを行う唯一の方法は、サブプロセスを使用して AVCONV をファイルに保存することです。いくつかの手順を節約するためにこれを行うことができるライブラリはありますか? Pydub または PySox でそれを行う方法が見つかりませんでした。これは、私が使用した、ビットレート、デュレーションなどの情報を変数 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 ] )
4

1 に答える 1

5

Pydubにはメタデータを取得するための関数が含まれてpydub.utils.mediainfo("/path/to/file")ますが、pydub はオーディオ ファイルのみを処理するように設計されています。ただし、 の現在の実装はmediainfoオーディオ固有の処理を行っていないように見えるため、うまくいく可能性があります。

ffmpeg/libav (具体的には ffprobe / avprobe ユーティリティ) によって提供されるメタデータの辞書を返します。

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

これは、pydub の単体テストで使用される te​​st1.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'
}   
于 2015-01-04T18:02:26.230 に答える