web-dev-qa-db-ja.com

すべてのオーディオではなくすべての字幕を含むffmpegでビデオを再エンコード

Ffmpegを使用して、すべての字幕を現状のまま維持しながら、スペースを節約するためにMatroskaファイルからビデオストリームを再エンコードしようとしています。正確なストリーム番号を指定しなくても機能する汎用コマンドを書きたいのですが。今では、ffmpegにデフォルトのビデオストリームとデフォルトのオーディオストリーム、そしてすべての字幕を選択させる方法を理解できません。

現在使用している入力ファイルにはこれらのストリームがありますが、他のファイルには異なるストリームがあります。

    [lavf] stream 0: video (mpeg2video), -vid 0
    [lavf] stream 1: audio (ac3), -aid 0, -alang eng, Surround 5.1
    [lavf] stream 2: audio (ac3), -aid 1, -alang fre, Surround 5.1
    [lavf] stream 3: audio (ac3), -aid 2, -alang ita, Surround 5.1
    [lavf] stream 4: audio (ac3), -aid 3, -alang spa, Surround 5.1
    [lavf] stream 5: audio (ac3), -aid 4, -alang eng, Stereo
    [lavf] stream 6: subtitle (dvdsub), -sid 0, -slang eng
    [lavf] stream 7: subtitle (dvdsub), -sid 1, -slang fre
    [lavf] stream 8: subtitle (dvdsub), -sid 2, -slang ita
    [lavf] stream 9: subtitle (dvdsub), -sid 3, -slang spa
    [lavf] stream 10: subtitle (dvdsub), -sid 4, -slang ara
    [lavf] stream 11: subtitle (dvdsub), -sid 5, -slang dan
    [lavf] stream 12: subtitle (dvdsub), -sid 6, -slang dut
    [lavf] stream 13: subtitle (dvdsub), -sid 7, -slang fin
    [lavf] stream 14: subtitle (dvdsub), -sid 8, -slang ice
    [lavf] stream 15: subtitle (dvdsub), -sid 9, -slang nor
    [lavf] stream 16: subtitle (dvdsub), -sid 10, -slang por
    [lavf] stream 17: subtitle (dvdsub), -sid 11, -slang swe
    [lavf] stream 18: subtitle (dvdsub), -sid 12, -slang fre
    [lavf] stream 19: subtitle (dvdsub), -sid 13, -slang ita
    [lavf] stream 20: subtitle (dvdsub), -sid 14, -slang spa

私が試したコマンド:

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska OUT.mkv

結果:1つのビデオストリーム、1つのオーディオストリーム、字幕ストリームなし

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy OUT.mkv

結果:1つのビデオストリーム、1つのオーディオストリーム、1つの字幕ストリーム

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -map 0 OUT.mkv

結果:すべてのビデオすべてのオーディオ、すべての字幕。

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy -map 0:s OUT.mkv

結果:動画なし音声なし、すべての字幕。

マニュアルからわかる限り、-c:s copyは、デフォルトのストリームだけでなく、すべてのストリームをコピーすることになっていますが、そうではありません。おそらくそれはバグですか?

明確にするために、私が求めているのは結果ですone v ideo、one a udioおよびall s ubtitles。

4
nilli

ストリームの選択デフォルトの動作では、ストリームのタイプごとに1つのストリームのみが選択されます。そのため、複数のオーディオストリームを持つ入力は、 1つのオーディオストリーム。この動作を無効にして、目的のストリームを手動で選択するには、 -mapオプション

これらの例では-c copy to stream copy (re-mux)入力から出力へ。再エンコードは行われません。

すべてのストリームをストリームコピーする

ffmpeg -i input -map 0 -c copy output

1番目のビデオストリーム、2番目のオーディオストリーム、すべての字幕

ffmpeg -i input -map 0:v:0 -map 0:a:1 -map 0:s -c copy output

3番目のビデオストリーム、すべてのオーディオストリーム、字幕なし

この例ではnegative mappingを使用して字幕を除外しています。

ffmpeg -i input -map 0:v:2 -map 0:a -map -0:s -c copy output

複数の入力からのストリームの選択

入力0からのすべてのビデオ、入力1からのすべてのオーディオ

ffmpeg -i input0 -i input1 -map 0:v -map 1:a -c copy output
16
llogan