如何使用ffmpeg overlay_cuda滤镜制作SBS视频?
How to use the ffmpeg overlay_cuda filter to make a SBS video?
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 命令:
- 输入每个视频。
- 第一个视频在右侧创建填充,然后上传到卡的内存中。
- 使用 overlay 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:
我终于解决了像素格式问题,现在用填充进行叠加(将 space 添加到叠加视频)
这是成功的命令:
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解码的视频。
- 第一个视频
[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”的新版 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 命令:
- 输入每个视频。
- 第一个视频在右侧创建填充,然后上传到卡的内存中。
- 使用 overlay 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:
我终于解决了像素格式问题,现在用填充进行叠加(将 space 添加到叠加视频)
这是成功的命令:
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解码的视频。
- 第一个视频
[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
来获取这个变量。