如何加速ffmpeg中的minterpolate?

如何加速ffmpeg中的minterpolate?

我在 Windows 10 上使用 ffmpeg 的 minterpolate(版本 git-2020-08-21)和以下命令:

ffmpeg -i $file -filter:v "minterpolate=mi_mode=mci:me_mode=bidir:mc_mode=aobmc:vsbmc=1:fps=60" -c:a copy "$file_60fps.mp4"

但CPU负载仅在工作时才15%达到。20%

我的 CPU 是 AMD 4800H,8 核 16 线程。我还有一台带 CUDA 的 NVIDIA GTX1650。

我找不到任何关于 GPU 加速或 minterpolate 的多线程方法的文档。

已经尝试过-threads 16,但没有任何改变。

如何加速这一进程?

答案1

这是一个Linux/MacOS 破解方法:

使用 bash 脚本创建主视频的片段,minterpolate在片段上运行并行实例,然后将生成的“minterpolated”片段连接在一起。

以下是一个示例:
https://gist.github.com/majal/1e63a511b41faeae188083777f8e4b46

(对于 Windows,转到 Linux 时需要有人制作这样的批处理文件。)

正如预期的那样,它可以有点搞笑在连接点上。

答案2

不同的解决方案,目前也有利用Tensorflow减慢视频速度的初步工作,TF使用GPU。

例如,参见 TF cuda:

https://github.com/Riccorl/Super-SloMo-tf2

或者 pytorch 实现

https://github.com/avinashpaliwal/Super-SloMo

对于我来说,添加一帧还不错,但开始迅速向下,变得不稳定。

https://youtu.be/Klu-cS81g0k

答案3

对于您的工作量,有两种潜在的解决方案:

1.FFmpeg的libplacebo滤镜集成:

平台无关libplacebo项目可能更适合你正在寻找的插值模式,集成在 FFmpeg 中作为 GPU 加速筛选。它的依赖项是 Vulkan 实现,如果需要,可以回退到llvm。可以-init_hw_device vulkan:llvmpipe在安装了 LLVM 的系统上通过 FFmpeg 启用此功能,并且无需在独立 GPU 上运行它。

作为目前记录,libplacebo 的frame_mixer私有选项有多个内核,可以根据所需的时间帧混合模式在运行时进行选择:

(a). 无:禁用帧混合,给出与“最近邻居”语义等同的结果。这是默认设置。

(b).过采样:此内核对输入视频进行过采样,以创建“平滑运动”类型的效果:如果输出帧恰好落在两个视频帧之间的过渡上,则根据相对重叠进行混合。每当需要保留原始主观外观时,建议使用此选项。

(c)mitchell_clamp:这是一个更大的滤波内核,可以平滑地插入多个帧,其设计方式旨在尽可能消除振铃和其他伪影。当需要最大程度的视觉平滑度时,这是推荐的选项。这也是计算最密集的模式。

(d)线性:帧与帧之间线性混合/淡入淡出。特别适用于构建幻灯片等。

所有插值操作都要求将私有过滤器选项fps设置为所需的输出帧速率。此值可以是合理的,例如 60000/1001(59.97fps)和 30000/1001(对于 NTSC 的 29.97fps)或十进制值,例如 30 等。fps设置此选项后,输入视频帧将被插值以将视频重新缩放到上述frame_mixer选项控制的指定目标帧速率。

下面提供了一个简单的例子,演示了如何使用mitchell_clamp时间帧混合模式与 VFR 输入来实现平滑的恒定 60 fps 输出:

ffmpeg -hide_banner -i "input" \
-init_hw_device vulkan \
-vf "libplacebo=fps=60:frame_mixer=mitchell_clamp" \
-c:v libx264 -crf 18 "output.mkv"

在我的测试中,它是一款性能非常出色的过滤器,能够实现实时吞吐量多个 1:N 转码工作流程双方英特尔的 OneVPLNVIDIA 的 NVENC编码器包装器。

2.英特尔的vpp_qsv过滤器实现:

第二种选择与英特尔的一VPL(目前已停产)QuickSync- 运行受支持的 Intel GPU 的系统。在这种情况下,使用当前的 FFmpeg 版本,您可以使用过滤器vpp_qsv。它有一个私有选项,其framerate参数与 的私有选项类似。libplacebofps

您可以通过以下方式打印出过滤器的使用选项:

ffmpeg -h filter=vpp_qsv

对于英特尔,可用的插值模式取决于 FFmpeg 构建中选择的特定运行时,因此,性能和一致性在很大程度上取决于所使用的运行时(传统 QSV 与现代 OneVPL)和所使用的 GPU。请参阅这个问题有关此申请通知的更多信息。

免责声明:

您的里程可能会有所不同,具体取决于您的输入文件特性、所选的编码器包装器以及可能与libplacebo过滤vpp_qsv器可以覆盖的范围不同的目标插值要求。建议在决定是否切换为满足您的特定要求之前对此进行测试minterpolate

相关内容