1. 環境
操作系統:Windows 10
FFmpeg版本:20171204
顯卡:GTX 965M
2. 過程
最近是有比較多的壓制需求,使用libx265軟壓的速度實在是慢的受不了,所以還是希望能用顯卡硬壓起碼速度快一點。之前有人跟我提過硬壓質量似乎不及軟壓,但是決定還是試一試。在ffmpeg官網找到硬壓的相關信息。
由于我用的是windows,所以驅動基本沒有特別配置。而且windows版的ffmpeg也是參數配置好的,所以這方面沒有考慮太多。linux平臺可能需要配置一下參數啥的。
壓制分為兩步,先是對視頻解碼再編碼。ffmpeg在兩步都提供了硬件加速方案。
在官網給出的例子是基于h264的,h265的硬件參數啥的可以用:
ffmpeg -codecs | sls cuvid
(備注:sls是powershell的命令,類似于linux下的grep命令)
可以看到這條:
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_nvenc hevc_qsv )
解碼器提供了hevc
, hevc_qsv
, hevc_cuvid
; 編碼器提供了libx265
, nvenc_hevc
, hevc_nvenc
, hevc_qsv
,但是這個nvenc_hevc
其實已經作廢了,你用它的話他會提示你自動給你轉到hevc_nvenc
。
解碼器的這三個用法我是不太懂有啥區別,也沒去做太多研究,因為在實踐中使用硬解的話是沒辦法同時硬壓字幕的,會報錯,況且硬解對于整體壓制速度并沒有太大提升,所以就拋棄硬解了。
編碼器的部分,libx265
就是軟壓,hevc_qsv
似乎是英特爾的集顯硬壓,具體看這里。那么留給n卡的只有hevc_nvenc
可以用了。
使用這條命令來查看該方法的參數:
ffmpeg -h encoder=hevc_nvenc
可以得到可用參數,我們這里探究的是-cq參數,給出的描述是:
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
我感興趣的原因是它和libx265,也就是軟壓的-crf參數很類似。所以接下來都是在其他參數不考慮的情況下對不同cq的對比。
3. 不同cq值的對比
我用的是諜影重重5的預告片壓制測試,原視頻數據如下:
Format : MPEG-4
Format profile : QuickTime
Codec ID : qt 2005.03 (qt )
File size : 35.6 MiB
Duration : 30 s 30 ms
Overall bit rate : 9 938 kb/s
Encoded date : UTC 2016-02-08 06:40:30
Tagged date : UTC 2016-02-08 06:40:30
Writing library : Apple QuickTime 7.7.3
在使用命令
ffmpeg -i original.mov -c:v hevc_nvenc -cq X cqx.mp4
進行測試后。結果如下:
Libx265 (軟壓)
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 5.53 MiB
Duration : 30 s 70 ms
Overall bit rate : 1 544 kb/s
Writing application : Lavf58.2.103
-cq 0(默認)
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 8.21 MiB
Duration : 30 s 70 ms
Overall bit rate : 2 290 kb/s
Writing application : Lavf58.2.103
-cq 1
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 8.21 MiB
Duration : 30 s 70 ms
Overall bit rate : 2 290 kb/s
Writing application : Lavf58.2.103
-cq 10
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 8.21 MiB
Duration : 30 s 70 ms
Overall bit rate : 2 290 kb/s
Writing application : Lavf58.2.103
-cq 20
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 8.21 MiB
Duration : 30 s 70 ms
Overall bit rate : 2 290 kb/s
Writing application : Lavf58.2.103
-cq 30
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 8.20 MiB
Duration : 30 s 70 ms
Overall bit rate : 2 286 kb/s
Writing application : Lavf58.2.103
-cq 35
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 5.52 MiB
Duration : 30 s 70 ms
Overall bit rate : 1 539 kb/s
Writing application : Lavf58.2.103
-cq 38
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 4.06 MiB
Duration : 30 s 70 ms
Overall bit rate : 1 132 kb/s
Writing application : Lavf58.2.103
-cq 41
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 3.06 MiB
Duration : 30 s 70 ms
Overall bit rate : 855 kb/s
Writing application : Lavf58.2.103
-cq 51
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/mp41)
File size : 1.41 MiB
Duration : 30 s 70 ms
Overall bit rate : 392 kb/s
Writing application : Lavf58.2.103
對比視頻在這里。
4. 結論
可以看到cq在1到30的變化并不大,在41以上畫面基本上是沒辦法看了。在和libx265的默認軟壓對比后,-cq值落在35到40之間是比較好的選擇。
在后續的實際應用中,我在壓制畫面動作較少的視頻,如交響樂視頻的情況下,-cq 37是一個對于我來說比較好的選擇。