这是我的命令
ffmpeg -y -i in.mp4 -vf v360=input=sg:ih_fov=118.2:iv_fov=69.5:output=hequirect:w=2924:h=2924 -b:v 102400k -bufsize 5000k -c:a copy out.mp4
我试过
ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i in.mp4 -vf v360=input=sg:ih_fov=118.2:iv_fov=69.5:output=hequirect:w=2924:h=2924 -c:v h264_nvenc -preset slow -b:v 102400k -bufsize 5000k -c:a copy out.mp4
但这导致
Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scale_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
答案1
简短的回答是“你不需要”
目前,截至撰写本文时(2022 年 5 月),stereo3d
或v360
滤镜均不支持 GPU 加速ffmpeg
。这意味着它们只能在您的 CPU 上运行。
使用 GPU“加速” v360 转码/转换的最简单方法是在 GPU 上执行一些操作,而在 CPU 上执行其他操作。
对于 v360 转换,我的流程通常大致如下
(具体情况是,使用宽度/高度为 2:1 的约 5-7k 分辨率双鱼眼 180 度 3D 视频)
ffmpeg -hide_banner -v verbose \
-hwaccel cuda \
-init_hw_device cuda=c \
-filter_hw_device c \
-hwaccel_output_format c \
-i "${my_file_to_process}" \
-vf "${see_filter_chain_section}" \
-c:v h264_nvenc \
-c:a aac \
-b:a 128k \
"${output_file_path}"
我通常使用的过滤链是
v360=dfisheye:fisheye:interp=line:ih_fov=180:iv_fov=180:d_fov=180
hw_upload_cuda
scale_cuda=w=1080:h=1080:interp_algo=bicubic:format=yuv420p
这通常会给我一个相当可接受的压扁视频,我这样做只是为了使视频缩放能够在移动设备上运行。这主要是作为如何使 CUDA 缩放与 CPU 绑定过滤器一起工作的示例。
答案2
不确定这是否正是您想要的,但您只需从您尝试的命令中删除参数即可使其工作-hwaccel cuda
。它将使用硬件进行视频编码,但它仍然会受到使用 CPU 的 v360 过滤器的一定限制。
示例:CPU 搭配 v360 – 10 fps;无滤镜 – 18 fps。NVENC 搭配 v360 – 34 fps;无滤镜 – 118 fps。