ffmpegoverlay_cudaフィルターを使用してSBSビデオを作成するにはどうすればよいですか?
数ヶ月前のFFMPEGは、新しいフィルター「overlay_cuda」を備えた新しいバージョンのFFMPEGをリリースしました。このフィルターは「オーバーレイ」と同じですが、Nvidiaカードを使用して適用します。
フィルターの説明をFFMPEGWebサイトで見つけましたが、使用方法の例はありません。私が見つけた唯一の例は、開発者のコミットからのものですが、ビデオまたは写真を別のビデオの上に置くことです。
通常のオーバーレイフィルターの前に、幅の2倍のnullsrc画像を使用してこれを実行しましたが、このフィルターの使用方法がわかりません。
コミットの説明: https://patchwork.ffmpeg.org/project/ffmpeg/patch/[email protected]/ ffmpegドキュメントのウェブページ: https://ffmpeg.org/ffmpeg-filters.html#overlay_005fcuda-1
あなたが私を助けてくれることを願っています。
更新:
私はこのFFmpeg注文を次のように行いました:
- 各ビデオを入力します。
- 最初のビデオは右側にパディングを作成し、カードのメモリにアップロードされます。
- オーバーレイCudaを使用すると、他のビデオが元のビデオの右側に配置されます。
ffmpeg -y -loglevel info \
-i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda[base];
[base][1:v]overlay_cuda=x=800:y=0" \
-an -c:v h264_nvenc overlay_test.mp4
しかし、私はこのエラーメッセージを受け取ります:
[overlay_cuda @ 0x55fdec4b2ec0] Can't overlay nv12 on yuv420p
[Parsed_overlay_cuda_2 @ 0x55fdec4b2d80] Failed to configure output pad on Parsed_overlay_cuda_2
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #1:0
ピクセルフォーマットに問題があります。お役に立てば幸いです。
アップデート2:
私はついにピクセルフォーマットの問題を解決し、パディング付きのオーバーレイを作成しました(オーバーレイビデオにスペースを追加します)
成功するコマンドは次のとおりです。
ffmpeg -y -loglevel info \
-i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda,scale_npp=format=nv12[base];
[base][1:v]overlay_cuda=x=800:y=0" \
-an -c:v h264_nvenc overlay_test.mp4
今、私はのx=800
ような変数に変更したいのですx=iw+1
が、このフィルターはそれをサポートしていないようです。グローバル変数を設定する方法はありますか?
回答
わかった!Cudaフィルターで何ができるかをもう一度読んだ後scale_npp
、ビデオのサイズを変更するだけでなく、ピクセル形式を変更できることがわかりました。
それで、いくつかのテストの後、私は非常に素晴らしい解決策を見つけました:
ffmpeg -y -loglevel info \
-hwaccel cuda -hwaccel_output_format cuda -i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]scale_npp=640:-2:format=yuv420p,hwdownload,pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda,scale_npp=format=nv12[base];
[1:v]scale_npp=640:-2:format=nv12[overlay_video];
[base][overlay_video]overlay_cuda=x=640:y=0" \
-an -c:v h264_nvenc overlay_test.mp4
このFFMPEGコマンドの理由:
- Cudaデコードで2つのビデオを入力します。
- 最初のビデオ
[0:v]
:- YUV420Pピクセルフォーマットでアスペクトラジオを維持しながら、幅を640ピクセルに拡大
- GPUメモリからシステムメモリにダウンロードします
- パディングフィルターを適用して、ビデオの右側に640ピクセルの幅を追加します
- GPUメモリに再度アップロードする
- ピクセルフォーマットをnv12に変更します
- ラベルを付ける
[base]
- 2番目のビデオ
[1:v]
- NV12ピクセルフォーマットでアスペクトラジオを維持しながら、幅を640ピクセルに拡大します。
- ラベルを付ける
[overlay_video]
overlay_cuda
フィルタを適用します[base]
背景ビデオとしてのビデオ[overlay_video]
フォアグラウンドビデオとしてのビデオ- ビデオ
[overlay_video]
として右側に640ピクセルを挿入し[base]
ます
- エンコードを終了します
-an
as Audio null(これは削除できます。実際の使用では、オーディオ信号をミキシングするか、2つのビデオから1つを選択するか、外部オーディオソースを追加する必要があります。)-c:v h264_nvenc
GPUとh264コーデックを使用してビデオをエンコードします(ここで必要に応じて変更できます)。
唯一の欠点は、事前に解像度を設定する必要があることです。入力解像度を設定する方法がありません(通常のオーバーレイフィルターのように)。幸い、これをスクリプトの変数のように作成し、ffprobe
以前にこの変数を取得するために使用できます。