如何在Python中从音频/视频文件中提取元数据和比特率信息

3
我想做的是从音频或视频文件中获取元数据并将其保存到数据库记录中。目前唯一的方法似乎是使用subprocess.Open调用将AVCONV保存到文件,然后读取该文件。是否有可以做到这一点以节省步骤的库?我无法找到使用Pydub或PySox完成此操作的方法。这是我使用的简单的初学者代码,它可以将比特率、持续时间等信息放入变量audio_info中,并将元数据放入metadata中。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 ] )

@Oz123 刚刚添加了我拼凑起来的代码,它确实可以工作!但输出结果相当糟糕。 - Fight Fire With Fire
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'
}   

Pydub非常棒!一行代码将包含标签和封面的alac文件转换为mp3:AudioSegment.from_file(src).export(dst, format='mp3', tags=mediainfo(src)['TAG']) - Toby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接