B站视频画质与上传视频画质的关系研究
SmallPeaches
2024年01月11日 20:54

1 前言

现在B站视频的画质越来越差,如何尽可能保证视频清晰、流畅成为了UP主必须研究的问题。本文通过对直播录播视频的研究,定量地研究了不同压缩方式、编码参数等对生成的B站视频的影响,希望能给各位UP主,尤其是直播录播组提供相应的解决方案。

2 省流结论

叔叔坏事做尽!本地再清晰的视频传到B站,不开大会员看普通1080P的视频都是糊的,开了大会员看1080P60帧效果才开始变好。最好的解决方案是伪4K,也就是把原来1080P的视频导出为4K分辨率,传到B站后把4K视频当做1080P播放,基本上画质能做到完全还原。

码率方面,导出视频时保证分辨率4K的情况下码率尽量开高,30M-50M,甚至100M都行,这样的话视频传到B站能让画质尽量不变差。对于一些需要上传大量视频的录播组,有能力的尽量还是传伪4K,哪怕是码率不变大效果也会变好很多。

3 详细实验

测试视频简介:本次实验所用素材来自 @三明治3Mz 2024年01月08日15时18分的直播,长度为30分钟,视频内容可以参考网页链接​ 。视频的基本参数如下:h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 20480 kb/s, 120 fps, 120 tbr, 1k tbn,实际测试其码率约为19691kbps。

测试环境:Intel Core I7-8700,16G内存,NVIDIA RTX2070,Windows 11,ffmpeg 5.1。FFmpeg参数:ffmpeg -y -hwaccel cuda -fflags +discardcorrupt -i input.mp4 -c:v h264_nvenc <可变编码器参数> -profile:v high -rc:v vbr -c:a aac -b:a 320K -s 2880x1620 output.mp4。特别注意,本次实验将视频重缩放到了2880x1620,用于在B站上传伪4K。

根据可变编码器参数的取值,实验分为10组,包括5组使用平均码率模式编码的视频,分别为10M,15M,20M,25M,30M(使用参数-b:v 10M的方式指定码率,记为bv10,其他码率类似);5组使用恒定质量编码的视频,分别为19,23,27,31,35(使用参数-cq 19的方式指定质量,记为cq19,其他类似)。

评估指标:本实验使用三种评估指标:PSNR(峰值信噪比,一般认为高于40dB说明与原视频几乎无差距,30-40dB表示图像质量好,20-30dB说明图像质量差,20dB以下说明极差)、SSIM(结构相似度,范围0-1)和VMAF(Netflix提出的用于评价视频质量的指标,百分制,一般认为95分以上效果较好)。

4 实验数据

实验结果视频和对比请参考网页链接​ ,本文主要研究定量实验结果,表格可以点击放大观看。

本地编码方面,只要码率不太低,PSNR基本上是比较高的,VMAF也都是99分以上,一般情况下没必要用恒定质量编码。另外,由于设置的编码器参数比较简单,基本上编码速度都在1.2-1.5倍速之间(特别注意这里是120帧的视频,编码速度只有60帧视频的一半左右)。

但是上传到B站之后,不同画质之间的区别就很大了。如果不开通大会员(播放普通1080P),无论本地使用何种编码方式,哪怕是直接传录播原视频,码率都在2600kbps左右,视频的PSNR都基本上在20多一点,VMAF都在60多分。说明普通1080P情况下,画质的区别实际上是不大的,或者说都是很糊的。

如果开通大会员,那么1080P60帧视频可以分配到5200kbps左右码率。但是使用较低码率做第一次压制(10M,15M这种低于原视频码率的数值),然后到B站经过二压之后画质损耗还是很明显的(VMAF只有90不到)。这里有个很奇怪的情况是,1080P60帧的原视频画质指标很低,猜想是存在部分帧完全相同被ffmpeg跳过计算导致的,具体的画质可以参考视频。

最好的办法是使用伪4K,这里将视频重缩放为2880x1620,恰好满足B站4K分辨率的最低要求。可以看到,只要本地一次压缩的视频码率够高,B站4K视频基本上都能分到17000kbps的码率,也就能最大程度的保留原视频的画质,VMAF、SSIM的指标基本上能和本地播放一个效果。更重要的是B站的4K支持120fps的高帧率视频,这是直接上传1080P视频达不到的高度。

5 备注

  1. 本文的实验视频和账号播放量都比较低,B站只会将视频二压为H264格式,如果播放量较高的话B站会视情况再次三压为AV1或者H265格式,码率和画质会更低,这里不考虑这种情况。

  2. 关于伪4K分辨率的问题,B站认为短边像素大于1600都按照4K视频来分配码率。但是实践操作中缩放为标准4K(3840x2160)还是缩放为符合B站要求的最低标准4K(2880x1620),这里没有继续深入做研究。个人认为缩放到2880x1620比较好,能让单位像素分到更多的码率。如果使用剪映等软件无法导出特定分辨率视频的话,只要保证码率够,直接生成4K视频问题也不大。