web-dev-qa-db-ja.com

新しいファイルを作成せずにffmpegを使用してストリームを追加します

メタデータ(説明、アートワーク、俳優など)でタグ付けされたビデオ(.mp4)がいくつかあり、ストリームとして追加したい字幕ファイルがあります。

ffmpegを使用して、ビデオと.srtファイルの両方を入力として設定し、新しい出力ファイルを取得できますが、出力は常にコンテナーレベルのメタデータをすべて失っているように見え、常に煩わしいことがあります。元のファイルに戻って削除します。

新しいファイルを作成せずに、字幕ファイルを新しいストリームとしてビデオファイルに追加する方法はありますか?元のビデオファイルを変更するだけですか?

Sublerのようなプログラムはこれを行うようですが、興味深いことに、コマンドラインから実行できますか?

5
Sam

ffmpegを使用してファイルをインプレースで編集することはできません。常に新しい出力ファイルを作成する必要があります。これはほとんどすべてのプログラムのデフォルトであり、多くの場合、出力ファイルは書き込み中にプログラムによってシーク可能で編集可能である必要があります。*

realの問題がメタデータの損失である場合は、次を試してください。

ffmpeg -i input.mp4 -i subtitles.srt \
-c copy -c:s mov_text \
-map 0 -map 1 -map_metadata 0 output.mp4

ffmpegでSRT(SubRip)を MP4準拠の字幕-c:s mov_textで変換する必要があります。そうしないと、ffmpegはストリームのコピーを拒否します。****

-map_metadataオプションは、すべてのグローバルメタデータを入力MP4ファイルから出力、つまりコンテナレベルで設定したものにコピーする必要があります。ビットストリームレベルのメタデータは、それ以上のオプションなしで自動的にコピーされる必要があります。

*もちろん、 sponge from moreutils のようなプログラムは、入力を「吸収」してファイルをインプレースで上書きできますが、これはシーク不可能な出力をサポートするマルチプレクサでのみ機能するため、 MP4ではありません。
** mov_textでエンコードされた字幕とQuickTimeプレーヤーに問題があります。 FFmpegチケット#1845 および #2488 を参照してください。

8
slhck