对于基于CRF的编码,请将以下代码段中的以下参数传递给FFmpeg:
-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high
当然,您需要调整目标比特率和固定cq
值。建议设置为19,因为它在视觉上与0相同,但保留了良好的压缩权衡以适合文件大小。见这个写了更多关于什么CRF一样。
请注意,-cq
标度是对数的,这意味着0本质上是无损的,而51绝对是最差的。
通过添加诸如B帧之类的选项(最多限制为3个,这需要H.264 Main配置文件及更高版本),可以进一步提高质量。基准配置文件不支持B帧。为此,请传递-bf {uint}
到视频编码器,从而-bf:v 4
导致编码器使用4个B帧。
这里的关键部分是-cq:v 19
和-rc:v vbr_hq
参数,它们允许您使用预设的可变比特率和最大允许比特率(-b:v
和-maxrate:v
)调整编码器,同时保持CRF值为19。
现在,关于NVENC的一些小笔记,以及对其进行高质量编码的调整:
与其他任何基于硬件的编码器一样,NVENC也有一些局限性,尤其是HEVC,这是已知的局限性:
在Pascal上:
对于HEVC编码,存在以下限制:
- 不支持CTU大小大于32。
- HEVC中的B帧也不受支持。
- NVENC编码器支持的纹理格式限制了编码器可以使用的色彩空间。目前,我们支持4:2:0(8位)和4:4:4(10位)。不支持外部格式,例如4:2:2 10位。这将影响某些需要此类色彩空间的工作流程。
- 前瞻控制也仅限于32帧。您可能需要查看此社论以获得更多详细信息。
Turing具有Pascal可用的所有增强功能,另外还增加了对HEVC的B帧支持以及使用B帧作为参考的功能。有关此功能的示例,请参见此答案。
在Maxwell Gen 2(GM200x系列GPU)上:
HEVC编码缺少以下功能:
对于Maxwell的影响是,由于缺少先行功能和自适应采样偏移(SAO)环路滤波功能,HEVC在受限比特率下运动较重的场景可能会遭受伪像(块状)的困扰。Pascal在此功能上有所改进,但是视构建视频编码器的SDK版本而定,并非所有功能都可用。
例如,在Pascal上用于H.264编码的加权预测模式需要NVENC SDK 8.0x及更高版本,并且此编码模式还将禁用B帧支持。同样,运行Nvidia Performance Primitives(NPP)和NVENC的基于硬件的缩放器的结合可能会导致视频缩放应用程序的性能提高,但代价是缩放伪像,尤其是缩放内容。NPP的缩放功能在GPU上的CUDA内核上运行时,同样会影响视频编码管道,因此,应逐案分析额外负载对性能的影响,以确定性能质量权衡是可以接受的。
请记住:与基于软件的等效实现相比,基于硬件的编码器将始终提供较少的自定义,因此,您的里程和可接受的输出质量将始终有所不同。
供您参考:
使用FFmpeg,您始终可以通过以下方式引用编码器的设置进行自定义:
ffmpeg -h encoder {encoder-name}
因此,对于基于NVENC的编码器,您可以运行:
ffmpeg -h encoder=hevc_nvenc
ffmpeg -h encoder=h264_nvenc
您还可以通过运行以下命令查看所有基于NVENC的编码器和基于NPP的缩放器(如果如此构建):
for i in encoders decoders filters; do
echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done
我的测试台上的样本输出:
encoders:
V..... h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
decoders:
V..... h263_cuvid Nvidia CUVID H263 decoder (codec h263)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)
V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)
V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)
V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)
V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)
V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)
filters:
... hwupload_cuda V->V Upload a system memory frame to a CUDA device.
... scale_npp V->V NVIDIA Performance Primitives video scaling and format conversion
slow
为fast
。CRF未在中实现nvenc
。