やりたいこと
シングルビットレートの MP4 ファイルを、5 つの異なるビットレートにトランスコードしたい。
環境
- Windows 10 Version 20H2
- ffmpeg version 4.2
- NVIDIA GeForce RTX 2060
- Driver Version : 27.21.14.5774
愚直にやるなら
各ビットレート毎に、コマンドライン引数のビットレートの設定を変えて ffmpeg を実行すればよい。
CPU エンコード版
ffmpeg -i 入力ファイル.mp4 -vb ターゲットのビットレート 出力ファイル.mp4
NVEnc 利用版
ffmpeg -i 入力ファイル.mp4 -vcodec h264_nvenc -vb ターゲットのビットレート 出力ファイル.mp4
一回のコマンド実行で複数の出力を得る方法
ffmpeg のコマンドの書式は以下のようになっており、入力と出力は基本的には好きなだけ追加できる(はず)。
ffmpeg (グローバルオプション) (入力Aオプション) (入力A) (出力1のオプション) (出力1) ....
なので、こんな感じで出力を連結して入力してみた。
ffmpeg -i 入力ファイル.mp4 -vcodec h264_nvenc -vb 2000k 出力ファイル1.mp4 -vcodec h264_nvenc -vb 1500k 出力ファイル2.mp4 -vcodec h264_nvenc -vb 1000k 出力ファイル3.mp4 -vcodec h264_nvenc -vb 750k 出力ファイル4.mp4 -vcodec h264_nvenc -vb 500k 出力ファイル5.mp4
これで上手くいくかと思いきや、出力ファイルが 4 つ以上になると怒られる。
[h264_nvenc @ 000001f885d9c380] OpenEncodeSessionEx failed: out of memory (10)
[h264_nvenc @ 000001f885d9c380] No NVENC capable devices found
Error initializing output stream 3:0 -- Error while opening encoder for output stream #3:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
原因調査
色々調べてみたところ、NVENC に同時に張れるセッション数に制限があるようだ、ということは分かった。
Nvidia Nvenc Video Conversion from mxf to mp4 getting error for multiple streams inside
とりうる手段としては、エンコードするストリームを明示的に指定するか、パッチを当ててセッション数のリミットを上書きしなければいけないらしい。
結果
今回どちらの対応策も取れなかったため、ビットレート毎に別々にコマンドを発行する形で結局落ち着いた。
(もっといい方法があるよ!という方いらっしゃったら教えてください…。)