ffmpeg -map コマンドが理解できない

ffmpeg -map コマンドが理解できない

mkv コンテナから mp4 にビデオ/オーディオをコピーしようとしています。実行すると、ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4ポーランド語のオーディオのビデオは表示されません。ビデオ ストリームはストリーム #0:0 の 1 つだけです。ストリーム #0:1 はポーランド語のオーディオ、#0:2 は英語、#0:3 - #0:5 は字幕です。

私は読むFFmpeg Wiki: マップしかし、よく分かりません。-map 0:1例 1 ではなぜ が 2 回記述されているのでしょうか? は何をしますか-c:s? #0:0 をビデオにコピーし、#0:2 をオーディオにコピーするコマンドはどのようになりますか?

答え1

-map <inputNo>:<streamNo>ffmpegにストリームを取得するよう指示するストリーム番号入力から入力番号これを出力に追加するには、<inputNo>0 から始まります。

場合によっては、同じ入力ストリームを 2 回 (例のように) 取得したいことがあります-map 0:1 -map 0:1。これは、それぞれを異なるコーデック/パラメータでエンコードできるためです。例では、出力に同じオーディオ ストリームが 2 回含まれており、1 つは MP3、もう 1 つは AAC です。

デフォルトでは(-mapつまり、コマンドがまったくない場合)、入力から 1 つのビデオ、1 つのオーディオ、および 1 つの字幕ストリームが取得されます。 1 つの入力からのすべてのストリームをマップする場合は、 を使用します-map <inputNo>

コマンドでビデオが取得されないということは、ビデオ トラックが MKV では多重化できるが MP4 では多重化できないコーデックでエンコードされていることを意味します。そのため、自動的に破棄されます。ffmpeg -i input.mkvトラックがどのコーデックでエンコードされているかを確認できるように、ログを投稿していただけますか?

最後に、-c:sは字幕コーデックに使用されます(は-c:aオーディオ用、は-c:vビデオ用です)

答え2

これは私が理解できた例です。次のコマンドを想像してください。

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

ffmpeg がマッピングを行う方法は次のとおりです。

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

どうしたの?

コマンドには、tears_of_steel.mkv という 1 つの入力しかありません。そのため、すべてのマップは #0: で始まります...

次に、最初のマップ オプション -map 0:0 を記述します。これは、入力の最初のストリーム (tears_of_steel.mkv) を参照します。これはビデオ ストリームである可能性もありますが、それは問題ではありません。

これは最初のマップ オプションなので、出力ファイル (tears_of_steel-v2.mkv) の最初のストリームにマップされます。

次に、2 番目のマップ オプション -map 0:2 を記述します。これは、入力の 3 番目のストリームを参照します。これは 2 番目のマップ オプションであるため、出力の 2 番目のストリームにマップされます。

等々...

私は自分のgithubにそれを書きました:ffmpeg のマップ

答え3

-c(コーデックを選択) および-map(ストリームを選択) オプションの動作は次のとおりです。

-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)

トランスコードせずに最初の入力ファイルからすべての字幕ストリームをコピーするには:

-map 0:s -c:s copy 

出力ファイルは mp4 で、入力ファイルは mkv であり、mp4 と互換性のある形式にトランスコード ( ) せずにビデオを出力することを選択した-c:v copyため、(再生可能な) ビデオのない mp4 ファイルが作成されます。

-c:v libx264代わりにmp4と互換性のあるビデオエンコーダーを指定するか-c:v copy、空白のままにしておきます(つまり、エンコーダーとffmpegを言及しないでください) 。選択されたエンコーダーは、各出力フォーマットによって登録されたデフォルトのものになります。

ビデオをトランスコードしたくない場合は (かなりの時間がかかる可能性があるため)、ビデオ ストリームを同じコンテナーにコピーしますが、必要なオーディオ (例: mkv) を選択します。トランスコードされたビデオと選択したオーディオを含む mp4 ファイルを取得するには、次の手順を実行します。

ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4

答え4

これは、私のように簡単な説明を好む人にとっては簡単な答えです。これは、mkvをmp4にコピーして、オーディオストリームを選択:

書かなければならない-map 0:ストリーム数マイナス1-c:a コピーの前に

ビデオに 3 つのストリームがあるとします (mediainfo で確認できます)。最初のストリームはビデオ、2 番目はデフォルトのオーディオ、3 番目は希望する言語のデフォルト以外のオーディオです。したがって、-map 0:3 ではなく -map 0:2 と記述する必要があります。

また、書く必要があります-map 0:0 を -c:v copy の前に追加しますそうしないと、ffmpeg はビデオ ストリームをコピーせず、オーディオ ストリームのみを取得します (ビデオに 2 つのビデオ ストリームがあり、2 つ目のストリームをコピーする場合は、-map 0:1 と記述する必要があります)。

だから最終コマンドライン次のようになります:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

この場合、最初のビデオストリームと3番目のオーディオストリームが取得されます。

もう一つの例:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

この場合、2番目のビデオストリームと7番目のオーディオストリームが取得されます。

これが役に立つことを願います

関連情報