簡體   English   中英

如何從python的音頻/視頻文件中提取元數據和比特率信息

[英]How can I extract the metadata and bitrate info from a audio/video file in python

我想做的是從音頻或視頻文件中獲取元數據並將其保存到數據庫記錄中,到目前為止,唯一的方法似乎是使用子過程將AVCONV保存到文件中。Open調用然后讀取該文件是有沒有圖書館可以這樣做以節省一些步驟? 我找不到使用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 ] )

Pydub 確實包含用於檢索元數據的函數pydub.utils.mediainfo("/path/to/file") ,盡管pydub僅設計用於處理音頻文件。 但是, mediainfo的當前實現似乎並沒有做任何音頻特定的事情,因此它可能對您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'
}   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM