gpt4 book ai didi

video - 在没有 hwdownload 的情况下将 ffpmeg OpenCL 过滤器输出传递给 NVenc?

转载 作者:行者123 更新时间:2023-12-04 22:52:13 28 4
gpt4 key购买 nike

我正在尝试使用 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 ?

最佳答案

2022 年编辑:
对于那些使用 Nvidia 卡并想要零拷贝 HDR 到 SDR 色调映射的用户,您现在可以使用强大的 Vulkan 过滤器 libplacebo它在 FFmpeg 5.0 中引入,无需 OpenCL 过滤器即可实现这一目标。
libplacebo是 MPV 播放器的下一代视频渲染器,它可以在 GPU 上执行高质量的视频处理,包括 HDR10 和 DV 内容的色调映射。由于已经实现了从CUDA内存派生到Vulkan,可以使用libplacebo过滤器与 NVDEC、NVENC 和其他 CUDA 过滤器链接以获得最佳性能。
要获得额外的 Vulkan 和 libplacebo 支持,您必须使用由 --enable-vulkan --enable-libshaderc --enable-libplacebo 构建的 ffmpeg .
可以从 https://github.com/BtbN/FFmpeg-Builds/releases 获取预构建的二进制文件
执行此操作的 cmd 片段:

./ffmpeg -threads 1 -hwaccel cuda -hwaccel_output_format cuda -i HDR.mp4 \
-vf "scale_cuda=w=1920:h=1080:interp_algo=bilinear,hwupload=derive_device=vulkan, \
libplacebo=tonemapping=auto:colorspace=bt709:color_primaries=bt709:color_trc=bt709:format=yuv420p:upscaler=none:downscaler=none:peak_detect=0, \
hwupload=derive_device=cuda" \
-c:v h264_nvenc -preset medium -profile:v high -b:v 8M -y SDR.mp4
这是什么意思:
  • 使用 NVDEC 硬件加速器将视频解码到 CUDA 内存
  • 使用 CUDA 过滤器将视频缩放到 1080p(双线性算法)
  • 使用 hwupload 从 CUDA 导出到 Vulkan 内存
  • 将自动色调映射从 HDR 应用到 SDR 8bit yuv420p,而不使用 libplacebo 的内置缩放器以提高性能
  • 使用 hwupload 从 Vulkan 派生到 CUDA 内存
  • 使用 NVENC 编码器编码为 H.264 1080p SDR 8M

  • 请注意 hwupload这里并不意味着复制回内存。
    相反,在这个特定的 CUDA-Vulkan 管道中,它的作用与 hwmap 相同。 .整个视频过滤管道都在您的 GPU 和 VRAM 上进行。 upscaler=none:downscaler=none:peak_detect=0这三个选项禁用了一些高质量的放大/缩小算法和 HDR 峰值检测功能,以换取更好的性能。您可以删除它们以获得最佳质量。
    有关 libplacebo 过滤器中的更多微调选项,请参阅
    http://ffmpeg.org/ffmpeg-all.html#libplacebo

    2021年原答案:
    至少现在没有。
    零拷贝纹理共享又名 hwmap在 Nvidia 为它们发布互操作方法之前,ffmpeg 中不提供 Cuda 和 OpenCL 设备之间的过滤器。
    https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__INTEROP.html
    Intel 和 AMD 为 D3D11/VAAPI<->OpenCL 互操作提供了一些 OpenCL 扩展,并且可以将一个共享图像(例如 NV12)拆分到不同的平面(例如平面 Y 和 UV)。
    cl_intel_va_api_media_sharing cl_intel_d3d11_nv12_media_sharing 来自英特尔和 cl_amd_planar_yuv 来自 AMD。
    至于英伟达,他们确实有 cl_nv_d3d11_sharing对于 D3D11<->OpenCL 互操作,但我认为它在 Cuda 方面效果不佳。
    另一种解决方案是将色调映射算法移植为 Cuda 过滤器,但这需要一些时间。一旦完成,可以预期巨大的速度提升。您可以像 scale_cuda 一样轻松使用它或 overlay_cuda过滤器等等。
    我看到Intel已经支持了 tonemap_vaapi通过他们最新的 iGPU 中的硬件功能进行过滤。不确定 Nvidia NVENC 在他们的 ASIC 中是否有类似的。

    关于video - 在没有 hwdownload 的情况下将 ffpmeg OpenCL 过滤器输出传递给 NVenc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65157235/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com