我正在尝试使用 ffmpeg 对 UHD HDR 视频流进行色调映射(和调整大小)。以下命令:
ffmpeg -vsync 0 -hwaccel cuda -init_hw_device opencl=ocl -filter_hw_device ocl
-threads 1 -extra_hw_frames 3 -c:v hevc_cuvid -resize 1920x1080 -i "INPUT.hevc"
-vf "hwupload,
tonemap_opencl=tonemap=mobius:param=0.01:desat=0:r=tv:p=bt709:t=bt709:m=bt709:format=nv12,
hwdownload,format=nv12,hwupload_cuda"
-c:v hevc_nvenc -b:v 8M "OUTPUT.hevc"
似乎工作(在 RTX 3080 上大约 200 FPS)。但是,我注意到它仍然使用一个 CPU 内核,而 GPU 使用率仅报告为 60-70%。当我只调整大小而不使用任何过滤器时,我得到大约 400FPS 和 100% GPU 使用率。
我怀疑最后的hwdownload,format=nv12,hwupload_cuda
语句有问题,因为这增加了主内存的绕道。我尝试只使用hwupload_cuda
而不使用hwdownload
(如此处建议:https ://stackoverflow.com/a/55747785/929037在此答案末尾附近的过滤器示例中),但随后出现以下错误:
Impossible to convert between the formats supported by the filter 'Parsed_tonemap_opencl_1' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
尝试使用hwmap
导致
Assertion dst->format == AV_PIX_FMT_OPENCL failed at C:/code/ffmpeg/src/libavutil/hwcontext_opencl.c:2814
是否有可能避免这种额外的hwdownload
?