群晖DS718+ VideoStation转码ffmpeg参数调整优化
有追剧的需求,通过DS get获取到PT等资源后,在上下班路上能通过群晖的VideoStation,配合手机的DS Video第一时间在线观看,这无疑是一个不错的选择。
如果不考虑手机网络流量,地铁上忽高忽低的网速,此时DS Video透传不转码时画面质量最好;但路上的环境往往不如人意,因此我往选择DS Video的低画质档在线转码。
群晖默认的低画质档在线转码的画质较差。为了在相近的平均码率下,尽量提高画质,就有了本文的内容。
如果你有和我相同的需求,手机也能解码H265,那么下文的描述可能对你会有一些参考的价值。
大家平时都用B站,B站对视频编码的优化是相当到位的。即使选择360p,480p这样的分辨率,在手机这样大小的屏幕下,质量也是勉强可接受的。这无疑是B站工程师对于编码库及H265算法的不断优化的成果。
我们使用DS718+CPU核显的硬件编码器,手机端的硬件解码器很难达到这样的效果。但是仍然可以修改ffmpeg的参数调优。调优的方法就是修改群晖实时转码的配置文件,调整传输给ffmpeg参数来改善实时转码的效果。下面给出实践步骤:
其一,通过SSH链接NAS
通过群晖的控制面板,打开SSH

连接SSH我习惯使用xshell,输入IP,用户名填写admin,填写密码后即可登录。
在使用admin账号登录后还不是root权限,需要我们提升权限。输入sudo -i回车,再次输入admin的密码即可切换到root账号。

第二,修改ffmpeg调用的参数
在使用DSM6.2版本时,Video Station配置文件保存在/volume1/@appstore/VideoStation/etc,使用cd /volume1/@appstore/VideoStation/etc切换到该目录。
ls命令看一下,可以看到一个TransProfile的配置文件。使用cp ./TransProfile ./TransProfile.bak备份配置文件以便后续恢复。
使用vi ./TransProfile 查看。找到“mpegts_hd480_h264_vaapi_vb500_mp3_ab96”这一行。对于DS718+,低画质转码使用的是这个配置。不同的设备型号,不同画质下使用的配置行可能是不同的。
这里把DS718+的配置文件内容粘贴如下
"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来实现硬件解码、分辨率缩放以及编码的,可以看到使用的是定码率500k,h264编码。
我们可以将其改为H265编码,同时使用定qp量化系数的方式来改善画面质量。修改后的参数如下:
"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表示增加编码复杂度来提高压缩率(我自己测试过7效果不明显,可能和群晖自带的ffmpeg有关),-bf 2表示启用b帧,-qp 30表明设置量化系数为30。其中对画质和码率有影响的为qp值,我自己设置的30。如果需要降低码率,可以增大qp值,一般不高于40;如果需要提高画质增加码率,可以减少qp值,一般不低于18。对于不同的视频类型,qp对画质和码率影响是不同的,一般而言动漫的码率都是很低的,连续剧的码率会高一些。音频码率为96k,我们在线观看时的码率为视频和音频的码率之和。也可以考虑更换为aac编码进一步压榨降低码率。
修改完毕后,shift+:,然后输入wq保存退出。
其三,验证修改是否生效
打开DS video,使用转码功能观看一个视频,通过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
可以看到我们需要的参数已经设置进去了,说明设置成功。通过调整配置文件中qp的值,就可以取得画质与码率的平衡。
待改进的地方:
修改完毕后,仍然有一些地方不够满意,有知道怎么解决的小伙伴们请给我留言。
1、低画质下分辨率为848*464,没有办法选择更低的分辨率。实际上,我也尝试了scale_vaapi=w=848:h=464中,将宽和高修改为更低分辨率,或者选择scale_vaapi=hd320,但是都没有生效。有指导怎么修改到更低分辨率的小伙伴们麻烦给我留言。
2、scale_vaapi这个分辨率转换质量不好,特别是4K视频在线转码,图像中的边缘、字体都会很别扭,没法选择三线性拉伸或者其他转换分辨率的算法。1080p分辨率的视频转换效果尚可。
3、硬编码的情况下,没法选择crf码率控制方式,因此退而求次选择了定qp的码率控制方式。
4、如果使用更强劲的CPU的群晖型号,其实可以考虑硬件解码,硬件分辨率转换,加上软件x265编码的方式进行,使用x265软件编码无疑可以使用更丰富的参数,达到更好的效果。
5、Plex收费,所以我简单尝试了下又卸载了,如果有钱的话可以考虑Plex,可能低分辨率转码的效果比群晖强一点。