如何使用ffmpeg overlay_cuda过滤器制作SBS视频?

问题描述

FFMPEG几个月前推出了带有新过滤器“ overlay_cuda”的FFMPEG新版本,该过滤器与“ overlay”相同,但使用了Nvidia卡进行应用。

我在FFMPEG网站上找到了该过滤器的说明,但没有使用它的示例。我发现的唯一示例来自开发人员提交,但是将视频或照片放在另一个视频上。

在使用普通的重叠式滤镜之前,我使用宽度为两倍的nullsrc图像进行此操作,但现在我不知道如何使用此滤镜。

提交说明:https://patchwork.ffmpeg.org/project/ffmpeg/patch/20200318071955.2329-1-yyyaroslav@gmail.com/ 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之类的变量,但似乎此过滤器不支持该变量。有没有办法设置全局变量?

解决方法

我明白了! 再次阅读使用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. 第一个视频[0:v]
    • 扩展到640像素宽度,使宽高比收音机保持YUV420P像素格式
    • 从GPU内存下载到系统内存
    • 应用填充滤镜以在视频右侧添加640像素的宽度
    • 再次上传到GPU内存
    • 将像素格式更改为nv12
    • 标签为[base]
  3. 第二个视频[1:v]
    • 扩展至640像素宽度,使宽高比收音机保持NV12像素格式
    • 标签为[overlay_video]
  4. 应用overlay_cuda过滤器
    • [base]视频作为背景视频
    • [overlay_video]视频作为前景视频
    • 在右侧插入[overlay_video]视频作为[base]视频
  5. 完成编码
    • -an作为音频null(可以删除,在实际使用中,您需要混合音频信号或从两个视频中选择一个,甚至添加外部音频源。)
    • -c:v h264_nvenc使用带有h264编解码器的GPU对视频进行编码(您可以在此处更改您的需求)。

唯一的缺点是您需要预先设置分辨率,无法设置输入分辨率(就像普通的叠加滤镜一样)。幸运的是,您可以将其设置为脚本变量,然后使用ffprobe来获取此变量。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...