Как изменить метаданные с помощью ffmpeg/avconv без создания нового файла?

Я пишу скрипт Python для создания аудио и видео подкастов. Есть куча записанных медиафайлов (, аудио и видео )и текстовых файлов, содержащих метаинформацию.

Теперь я хочу запрограммировать функцию, которая будет добавлять информацию из текстовых файлов метаданных во все медиафайлы (исходные и преобразованные ). Потому что мне приходится работать со многими файлами разных форматов (wav., flac, mp3, mp4, ogg, ogv... )Было бы здорово иметь инструмент, добавляющий метаданные в произвольные форматы.

Мой вопрос:

Как я могу изменить метаданные файла с помощью ffmpeg/avconv, не изменяя его аудио или видео и не создавая новый файл? Есть ли другой инструмент командной строки/python, который сделает эту работу за меня?

Что я пробовал до сих пор:

Я подумал, что ffmpeg/avconvможет быть таким инструментом, потому что он может работать почти со всеми форматами мультимедиа. Я надеялся, что если я установлю -i input_fileи output_fileна один и тот же файл, ffmpeg/avconvбудет достаточно умен, чтобы оставить файл без изменений. Тогда я мог бы установить -metadata key=value, и только метаданные будут изменены.

Но я заметил,что если я наберу avconv -i test.mp3 -metadata title='Test title' test.mp3, звук test.mp3будет преобразован в другой битрейт.

Поэтому я решил использовать -c copyдля копирования всей видео- и аудиоинформации. К сожалению, это тоже не работает:

:~$ du -h test.wav # test.wav is 303 MB big
303M    test.wav

:~$ avconv -i test.wav -c copy -metadata title='Test title' test.wav
avconv version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the
Libav    developers
built on Jun 12 2012 16:37:58 with gcc 4.6.3
[wav @ 0x846b260] max_analyze_duration reached
Input #0, wav, from 'test.wav':
Duration: 00:29:58.74, bitrate: 1411 kb/s
    Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s
File 'test.wav' already exists. Overwrite ? [y/N] y
Output #0, wav, to 'test.wav':
Metadata:
    title           : Test title
    encoder         : Lavf53.21.0
    Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, 1411 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press ctrl-c to stop encoding
size=     896kB time=5.20 bitrate=1411.3kbits/s    
video:0kB audio:896kB global headers:0kB muxing overhead 0.005014%

:~$ du -h test.wav # file size of test.wav changed dramatically
900K    test.wav

Видите ли, я не могу использовать -c copy, если input_fileи output_fileсовпадают. Конечно, я мог бы создать временный файл:

:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3
:-$ mv test_tmp.mp3 test.mp3

Но это решение создаст (временно )новый файл в файловой системе и поэтому не является предпочтительным.

19
задан Stephan Kulla 15 July 2012 в 13:48
поделиться