群暉DS718+ VideoStation轉(zhuǎn)碼ffmpeg參數(shù)調(diào)整優(yōu)化
有追劇的需求,通過DS get獲取到PT等資源后,在上下班路上能通過群暉的VideoStation,配合手機(jī)的DS Video第一時(shí)間在線觀看,這無(wú)疑是一個(gè)不錯(cuò)的選擇。
如果不考慮手機(jī)網(wǎng)絡(luò)流量,地鐵上忽高忽低的網(wǎng)速,此時(shí)DS Video透?jìng)鞑晦D(zhuǎn)碼時(shí)畫面質(zhì)量最好;但路上的環(huán)境往往不如人意,因此我往選擇DS Video的低畫質(zhì)檔在線轉(zhuǎn)碼。
群暉默認(rèn)的低畫質(zhì)檔在線轉(zhuǎn)碼的畫質(zhì)較差。為了在相近的平均碼率下,盡量提高畫質(zhì),就有了本文的內(nèi)容。
如果你有和我相同的需求,手機(jī)也能解碼H265,那么下文的描述可能對(duì)你會(huì)有一些參考的價(jià)值。
大家平時(shí)都用B站,B站對(duì)視頻編碼的優(yōu)化是相當(dāng)?shù)轿坏?。即使選擇360p,480p這樣的分辨率,在手機(jī)這樣大小的屏幕下,質(zhì)量也是勉強(qiáng)可接受的。這無(wú)疑是B站工程師對(duì)于編碼庫(kù)及H265算法的不斷優(yōu)化的成果。
我們使用DS718+CPU核顯的硬件編碼器,手機(jī)端的硬件解碼器很難達(dá)到這樣的效果。但是仍然可以修改ffmpeg的參數(shù)調(diào)優(yōu)。調(diào)優(yōu)的方法就是修改群暉實(shí)時(shí)轉(zhuǎn)碼的配置文件,調(diào)整傳輸給ffmpeg參數(shù)來改善實(shí)時(shí)轉(zhuǎn)碼的效果。下面給出實(shí)踐步驟:
其一,通過SSH鏈接NAS
通過群暉的控制面板,打開SSH

連接SSH我習(xí)慣使用xshell,輸入IP,用戶名填寫admin,填寫密碼后即可登錄。
在使用admin賬號(hào)登錄后還不是root權(quán)限,需要我們提升權(quán)限。輸入sudo -i回車,再次輸入admin的密碼即可切換到root賬號(hào)。

第二,修改ffmpeg調(diào)用的參數(shù)
在使用DSM6.2版本時(shí),Video Station配置文件保存在/volume1/@appstore/VideoStation/etc,使用cd /volume1/@appstore/VideoStation/etc切換到該目錄。
ls命令看一下,可以看到一個(gè)TransProfile的配置文件。使用cp ./TransProfile?./TransProfile.bak備份配置文件以便后續(xù)恢復(fù)。
使用vi ./TransProfile 查看。找到“mpegts_hd480_h264_vaapi_vb500_mp3_ab96”這一行。對(duì)于DS718+,低畫質(zhì)轉(zhuǎn)碼使用的是這個(gè)配置。不同的設(shè)備型號(hào),不同畫質(zhì)下使用的配置行可能是不同的。
這里把DS718+的配置文件內(nèi)容粘貼如下
"mpegts_hd480_h264_vaapi_vb500_mp3_ab96": "-vcodec h264_vaapi? ? ? -vf format=nv12|vaapi,hwupload,setsar=sar=1,scale_vaapi=hd480? -vsync 2? -bf 0 -vb 500k -acodec libmp3lame -ab 96k -ac 2 -f ssegment"
從上面的命令可以看出,DS718+是使用Linux的vaapi來實(shí)現(xiàn)硬件解碼、分辨率縮放以及編碼的,可以看到使用的是定碼率500k,h264編碼。
我們可以將其改為H265編碼,同時(shí)使用定qp量化系數(shù)的方式來改善畫面質(zhì)量。修改后的參數(shù)如下:
"mpegts_hd480_h264_vaapi_vb500_mp3_ab96": "-vcodec h264_vaapi? ? ? -vf format=nv12|vaapi,hwupload,setsar=sar=1,scale_vaapi=hd480 -c:v hevc_vaapi -vsync 2 -compression_level 7 -bf 2 -qp 30 -acodec libmp3lame -ab 96k -ac 2 -f ssegment"
其中,hevc_vaapi表示使用h265編碼,compression_level 7表示增加編碼復(fù)雜度來提高壓縮率(我自己測(cè)試過7效果不明顯,可能和群暉自帶的ffmpeg有關(guān)),-bf 2表示啟用b幀,-qp 30表明設(shè)置量化系數(shù)為30。其中對(duì)畫質(zhì)和碼率有影響的為qp值,我自己設(shè)置的30。如果需要降低碼率,可以增大qp值,一般不高于40;如果需要提高畫質(zhì)增加碼率,可以減少qp值,一般不低于18。對(duì)于不同的視頻類型,qp對(duì)畫質(zhì)和碼率影響是不同的,一般而言動(dòng)漫的碼率都是很低的,連續(xù)劇的碼率會(huì)高一些。音頻碼率為96k,我們?cè)诰€觀看時(shí)的碼率為視頻和音頻的碼率之和。也可以考慮更換為aac編碼進(jìn)一步壓榨降低碼率。
修改完畢后,shift+:,然后輸入wq保存退出。
其三,驗(yàn)證修改是否生效
打開DS video,使用轉(zhuǎn)碼功能觀看一個(gè)視頻,通過ps -ef | grep ffmpeg查看
root@DiskStation718:/volume1/@appstore/VideoStation/etc# ps -ef | grep ffmpeg
root? ? ?32433 32432 38 20:05 ?? ? ? ? 00:00:05 /var/packages/VideoStation/target/bin/ffmpeg -ss 0.000 -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -noautorotate -i /volume2/video/1.mkv -vcodec h264_vaapi -vf format=nv12|vaapi,hwupload,setsar=sar=1,scale_vaapi=w=848:h=464 -c:v hevc_vaapi -vsync 2 -compression_level 7 -bf 2 -qp 30 -acodec libmp3lame -ab 96k -ac 2 -f ssegment -pix_fmt yuv420p -segment_format mpegts -segment_list_type m3u8 -hls_seek_time 0 -segment_time 5 -segment_time_delta 0.000 -segment_start_number 00000 -individual_header_trailer 0 -avoid_negative_ts 0 -break_non_keyframes 1 -max_muxing_queue_size 1024 -map 0:0 -map 0:1 /tmp/VideoStation/HLS/91a9d256a5a2521d6e942a91db39ae8b_RRBWK8Q4/slice-%05d.ts
可以看到我們需要的參數(shù)已經(jīng)設(shè)置進(jìn)去了,說明設(shè)置成功。通過調(diào)整配置文件中qp的值,就可以取得畫質(zhì)與碼率的平衡。
待改進(jìn)的地方:
修改完畢后,仍然有一些地方不夠滿意,有知道怎么解決的小伙伴們請(qǐng)給我留言。
1、低畫質(zhì)下分辨率為848*464,沒有辦法選擇更低的分辨率。實(shí)際上,我也嘗試了scale_vaapi=w=848:h=464中,將寬和高修改為更低分辨率,或者選擇scale_vaapi=hd320,但是都沒有生效。有指導(dǎo)怎么修改到更低分辨率的小伙伴們麻煩給我留言。
2、scale_vaapi這個(gè)分辨率轉(zhuǎn)換質(zhì)量不好,特別是4K視頻在線轉(zhuǎn)碼,圖像中的邊緣、字體都會(huì)很別扭,沒法選擇三線性拉伸或者其他轉(zhuǎn)換分辨率的算法。1080p分辨率的視頻轉(zhuǎn)換效果尚可。
3、硬編碼的情況下,沒法選擇crf碼率控制方式,因此退而求次選擇了定qp的碼率控制方式。
4、如果使用更強(qiáng)勁的CPU的群暉型號(hào),其實(shí)可以考慮硬件解碼,硬件分辨率轉(zhuǎn)換,加上軟件x265編碼的方式進(jìn)行,使用x265軟件編碼無(wú)疑可以使用更豐富的參數(shù),達(dá)到更好的效果。
5、Plex收費(fèi),所以我簡(jiǎn)單嘗試了下又卸載了,如果有錢的話可以考慮Plex,可能低分辨率轉(zhuǎn)碼的效果比群暉強(qiáng)一點(diǎn)。