Warm tip: This article is reproduced from serverfault.com, please click

video-将ffpmeg OpenCL过滤器输出传递到NVenc,而无需进行hdownload?

(video - Pass ffpmeg OpenCL filter output to NVenc without hwdownload?)

发布于 2020-12-05 13:08:22

我正在尝试使用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%。当我只调整大小而没有任何过滤器时,GPU使用率达到100%时,我得到大约400FPS。

我怀疑最后一条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

Questioner
w1th0utnam3
Viewed
44
nyanmisaka 2021-01-05 03:52:35

至少现在不行。

hwmapffmpeg中的Cuda和OpenCL设备之间的零拷贝纹理共享(也称为过滤器)在ffmpeg中不可用,直到Nvidia为其发布互操作方法为止。

https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__INTEROP.html

英特尔和AMD为d3d11 / vaapi提供了一些OpenCL扩展-opencl互操作。例如来自Intel和AMD。cl_intel_va_api_media_sharing cl_intel_d3d11_nv12_media_sharingcl_amd_planar_yuv

至于Nvidia,他们确实有cl_nv_d3d11_sharingd3d11-opencl互操作性,但是我认为Cuda不会很好地工作。

另一个解决方案是将色调映射算法移植为Cuda滤波器,但这需要花费一些时间。一旦完成,可以期待巨大的速度改进。你可以像使用它scale_cudaoverlay_cuda过滤器一样轻松地使用它

我已经看到英特尔已经tonemap_vaapi在其最新的iGPU中支持通过硬件功能进行过滤。不确定Nvidia NVENC的ASIC中是否有类似的产品。