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

Posted

技术标签:

【中文标题】如何使用 ffmpeg overlay_cuda 过滤器制作 SBS 视频?【英文标题】:How to use the ffmpeg overlay_cuda filter to make a SBS video? 【发布时间】:2020-12-07 18:44:11 【问题描述】:

FFMPEG 几个月前推出了带有新过滤器“overlay_cuda”的新版本 FFMPEG,此过滤器与“覆盖”相同,但使用 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 命令:

    输入每个视频。 第一个视频在右侧创建填充,然后上传到卡的内存中。 使用覆盖 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 之类的变量,但这个过滤器似乎不支持。有没有办法设置全局变量?

【问题讨论】:

【参考方案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 解码输入两个视频。 第一个视频[0:v]: 缩放至 640 像素宽度,保持宽高比为 YUV420P 像素格式 从 GPU 内存下载到系统内存 应用填充滤镜在视频右侧添加 640 像素宽度 再次上传到 GPU 内存 将像素格式更改为 nv12 标签为[base] 第二个视频[1:v] 缩放至 640 像素宽度,保持宽高比为 NV12 像素格式 标签为[overlay_video] 应用overlay_cuda过滤器 [base]视频作为背景视频 [overlay_video]视频作为前景视频 在右侧插入[overlay_video] 640 像素作为[base] 视频 完成编码 -an as Audio null (这个可以删掉,实际使用中需要混合音频信号或从两个视频中选择一个,甚至添加外部音频源。) -c:v h264_nvenc 使用带有 h264 编解码器的 GPU 对视频进行编码(您可以根据需要进行更改)。

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

【讨论】:

以上是关于如何使用 ffmpeg overlay_cuda 过滤器制作 SBS 视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ffmpeg中使用滤镜技术

如何在ffmpeg中使用滤镜技术

如何在android上使用ffmpeg录制视频?

如何在 ReactJS 项目中使用 ffmpeg.js

如何使用 FFmpeg 直播本地视频

如何使用ffmpeg库把从摄像头传回的bmp图像不断保存成视频?