ffmpegoverlay_cudaフィルターを使用してSBSビデオを作成するにはどうすればよいですか?

Aug 18 2020

数ヶ月前の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注文を次のように行いました:

  1. 各ビデオを入力します。
  2. 最初のビデオは右側にパディングを作成し、カードのメモリにアップロードされます。
  3. オーバーレイ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が、このフィルターはそれをサポートしていないようです。グローバル変数を設定する方法はありますか?

回答

Maxtrix Aug 24 2020 at 17:37

わかった!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コマンドの理由:

  1. Cudaデコードで2つのビデオを入力します。
  2. 最初のビデオ[0:v]
    • YUV420Pピクセルフォーマットでアスペクトラジオを維持しながら、幅を640ピクセルに拡大
    • GPUメモリからシステムメモリにダウンロードします
    • パディングフィルターを適用して、ビデオの右側に640ピクセルの幅を追加します
    • GPUメモリに再度アップロードする
    • ピクセルフォーマットをnv12に変更します
    • ラベルを付ける [base]
  3. 2番目のビデオ [1:v]
    • NV12ピクセルフォーマットでアスペクトラジオを維持しながら、幅を640ピクセルに拡大します。
    • ラベルを付ける [overlay_video]
  4. overlay_cudaフィルタを適用します
    • [base] 背景ビデオとしてのビデオ
    • [overlay_video] フォアグラウンドビデオとしてのビデオ
    • ビデオ[overlay_video]として右側に640ピクセルを挿入し[base]ます
  5. エンコードを終了します
    • -an as Audio null(これは削除できます。実際の使用では、オーディオ信号をミキシングするか、2つのビデオから1つを選択するか、外部オーディオソースを追加する必要があります。)
    • -c:v h264_nvenc GPUとh264コーデックを使用してビデオをエンコードします(ここで必要に応じて変更できます)。

唯一の欠点は、事前に解像度を設定する必要があることです。入力解像度を設定する方法がありません(通常のオーバーレイフィルターのように)。幸い、これをスクリプトの変数のように作成し、ffprobe以前にこの変数を取得するために使用できます。