2015-01-02 3 views
2

Что я хотел бы сделать, это получить метаданные из аудио или видео файлов и сохранить их в записи базы данных, пока единственный способ сделать это это, похоже, сохраняет AVCONV в файл с использованием подпроцесса. Откройте вызов, затем прочитайте этот файл, есть ли библиотеки, которые могут сделать это, чтобы сохранить некоторые шаги? Я не мог найти способ сделать это с помощью Pydub или PySox. Вот мой упрощенный код для начинающих, который я использовал, который работает, и помещает биттрейт, продолжительность и т. Д. В переменную audio_info и метаданные в метаданные. Выход OGG работал иначе, чем другие тестируемые форматы (что было тонкой видео и аудио!).Как извлечь метаданные и данные о битрейтах из аудио/видеофайла в python

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.utils.mediainfo("/path/to/file"), хотя pydub предназначен только для борьбы с аудио файлами. Однако текущая реализация mediainfo, похоже, не делает ничего конкретного звука, так что это может сработать для вас.

Это возвращает словарь метаданных, как это предусмотрено FFmpeg/libav (в частности ffprobe/avprobe полезности)

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

, который для файла test1.mp3, используемого модульных тестов pydub, в возвращающей:

{ 
    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 отлично! Oneliner для преобразования файла alac, включая теги и обложки двух mp3: 'AudioSegment.from_file (src) .export (dst, format = 'mp3', tags = mediainfo (src) ['TAG'])' – Toby

Смежные вопросы