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 的单元测试使用的 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'
}   
于 2015-01-04T18:02:26.230 回答