如何在ffmpeg中使用nvenc进行CRF编码?


23

这是我当前用于将视频(1080p)的大小从2GB调整为300MB的命令,但是需要很多时间:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

我在NVIDIA GTX1070上尝试了nvenc:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

输出尺寸始终为原始尺寸的3⨉或5⨉– nvenc不使用-crf

那么,如何在ffmpeg中使用nvenc来转换/调整高质量和小尺寸视频的大小?我应该使用GPU进行编码吗?


您可以在第一个命令中更改slowfast。CRF未在中实现nvenc
Gyan

NVENC的目标是允许实时视频编码(用于视频通话);质量是从属考虑。
CL。

Answers:


24

对于基于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,这是已知的局限性:

  1. 在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帧作为参考的功能。有关此功能的示例,请参见此答案。

  1. 在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

1
好答案!nvenc上的ffmpeg Wiki有点过时了,并且缺少所有这些信息……如果您有几分钟的时间,那么如果您可以在那里贡献自己的知识,那就
太好了

1
感谢您的回答:) ffmpeg wiki需要更多这样的答案
hongducwb

感谢您的反馈。我将研究将其添加到FFmpeg Wiki。
林正浩

输出的颜色文件看起来更暗,我记得一个参数可以控制与输入文件相同的颜色
hongducwb

2
vbr_minqp似乎现在已过时。有点同意这个答案可能会被误解,因为没有CRF模式h264_nvenc
slhck

4

我相信我找到了解决方案:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

似乎h264_nvenc使用-qp而不是-crf。此选项仅在-rc设置为时有效constqp


1
不,-qp与有所不同-crfh264_nvenc-qp相当于libx264-qp

@Meow对我来说足够近了,但是很高兴知道有区别。对于以后可能会看到此内容的任何人,此页面都说明了CRF和QP之间的区别。
Alexander01998

3

对于-crf从libx264替换可以是-cq-qp从h264_nvenc:

-crf 选择恒定质量模式的质量

-cq 在VBR速率控制中为恒定质量模式设置目标质量级别(0到51,0表示自动)

-qp 恒定量化参数速率控制方法(从-1到51)(默认-1)

最快的硬件加速编码方法:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resize输入分辨率(硬件);无需使用ffmpeg进行--enable-libnppfor scale_npp过滤器的编译。

有关更多信息:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.