web-dev-qa-db-ja.com

新しいファイルを作成せずにffmpeg / avconvでメタデータを変更する方法は?

オーディオとビデオのポッドキャストを作成するためのpythonスクリプトを書いています。記録されたメディアファイル(オーディオとビデオ)とメタ情報を含むテキストファイルの束があります。

次に、メタデータテキストファイルからすべてのメディアファイル(元のファイルと変換されたファイル)に情報を追加する関数をプログラムしたいと思います。多くの異なるファイル形式(wavflacmp3mp4oggogv。 ..)任意のフォーマットにメタデータを追加するツールがあればすばらしいでしょう。

私の質問:

ffmpeg/avconvを使用してファイルのメタデータを変更するには、ファイルのオーディオやビデオを変更せず、新しいファイルを作成しませんか?私のために働く別のコマンドライン/ Pythonツールはありますか?

私がこれまでに試したこと:

ffmpeg/avconvは、ほぼすべてのメディア形式を処理できるため、このようなツールになり得ると思いました。 -i input_fileoutput_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 copyinput_fileが同じ場合、output_fileは使用できません。もちろん、一時ファイルを作成することもできます。

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

しかし、このソリューションはファイルシステム上に(一時的に)新しいファイルを作成するため、推奨されません。

20
Stephan Kulla

avconvのメーリングリスト に質問して、 次の回答 を取得しました。

„いいえ、[新しいファイルを作成せずにメタデータを変更する]ことはできません。libavformatAPIもavconv設計も、ファイルのインプレース編集はできません。 "

12
Stephan Kulla

メタデータを変更するとファイルの長さが変更され、メタデータがファイルの先頭近くにあると予想されるため、オーディオとビデオはファイルの先頭とは異なるオフセットで開始されます。したがって、最初に一時ファイルを作成してから、後でファイルの名前を変更しない限り、メタデータを変更することはできません。

新しいメタデータが正確に同じサイズの場合、およびメタデータがコンテナ(ファイル)のどこにあるかがわかります可能性があります何らかの16進エディタを使用して、単に文字を置き換えます。頑張ってください。

また。 nullを埋め込むと、短いデータを直接配置できる場合がありますが、これは一部のプレーヤーにとって問題になる可能性があります。

1
Cool Javelin