一、背景随着移动互联网的深入发展,视频消费场景逐渐成为主流。早期由于手机硬件的限制,制作出来的视频在画质和清晰度上存在较大差距。问题是用户体验不是很好。当时的网络也正处于4G发展阶段,网络限制无法继续支撑高清视频的消费。然而,如今5G的发展如火如荼。越来越不满意低质量和低清晰度的视频。提升视频质量和清晰度势在必行,需要一套能够有效提升视频清晰度的优化方案。2、评价标准在做一件事情之前,首先需要确定评价这件事情的标准。因此,在提出视频清晰度优化方案之前,需要确定衡量视频清晰度的评价标准。评价视频清晰度的标准有两个:2.1客观标准客观标准是用一种算法来计算视频画面质量得分。在相同条件下,如果视频A的质量得分高于视频B,则说明视频A的保真质量优于视频B。视频更好。评价视频质量的算法有两种:FullReference:逐帧比较分析两段视频,计算比较质量。这个用的比较多。常见的VMAF、PSNR、SSIM都是fullreference。部分参考:截取视频中的部分帧进行对比分析。有些场景,比如直播,是不能完全比较的。截取一些帧进行比较比较科学。目前Netflix推出的VMAF算法是评价视频质量的主流算法。下面简单介绍一下:VMAF全称VideoMulti-methodAssessmentFusion,利用人类视觉模型和机器学习来评估视频的质量。VMAF的评价指标主要包括:其中,VIF和DLM在空间域,代表一帧内的特征;TI是时域的,表示多帧之间的相关特征。视频信息保真度(VIF:VisualQualityFidelity)细节损失指标(DLM:DetailLossMeasure)时域运动指数/平均相对位置像素差(TI:TemporalInformation)VMAF基于SVM的nuSvr算法,在运行过程中,根据对预训练好的模型,给每个视频特征分配不同的权重,为每张图片生成一个分数,最后使用均值算法计算视频的最终分数。VMAF计算的分数范围是0到100,其中0代表质量最低,100代表质量最高,后面的比较只给出分数。2.2主观标准客观标准固然重要,但视频是给人看的。最终视频的质量好坏取决于用户的主观感受。换句话说,两个视频的VMAF可能相似,但用户对它们的感知可能不同。一些用户喜欢柔和的颜色,而另一些用户则喜欢暖色。主观标准操作起来比较简单。找几个视频,让用户看完后主观评价。视频A和视频B的质量如何比较?这种输出的输出结果比较准确,但是工作量比较大,不容易大规模推广。.因此,根据项目需求,在特定时间使用客观评价标准,在特定场景下使用主观评价标准。比如下面两张图,他们的VMAF值是差不多的,但是第二张图看起来比第一张图好很多,也更亮。这并没有改变图片的编码结构,只是对图片本身做了一些调整。颜色处理(我们下面会单独讲),可以显着提升主观体验。因此,视频质量的评价需要结合主观标准和客观标准来判断。而且我们建议在一定条件下,主观标准更重要,因为客观标准只是模拟人眼的视觉系统,与真实场景还是有差距的。3.基础优化通过上面的描述,我们已经基本了解了视频质量的评价标准,但是如果要提升视频质量,这些还远远不够。我们还需要介绍视频的基本属性以及这些属性对视频质量的影响程度。质量。我们首先使用MediaInfo查看视频的属性。由于我们关注图像质量,我们自动忽略封装格式和音频流信息,只关注视频轨道信息:VideoID:1Format:AVCFormat/Info:AdvancedVideoCodecFormatprofile:High@L3.1Formatsettings:CABAC/4RefFramesFormat设置,CABAC:YesFormat设置,参考帧:4framesCodecID:avc1CodecID/Info:AdvancedVideoCodingDuration:2min41sBitrate:634kb/sBitratemode:CBRWidthpel60Height:9540pixelsDisplayaspectratio:16:9帧速率模式:恒定帧速率:25.000FPSColors速度:YUVChroma子采样:4:2:0位深度:8位扫描类型:ProgressiveBits/(像素*帧):0.049流大小:12.2MiB(94%)编写库:x264核心148编码设置:cabac=1/ref=3/deblock=1:0:0/analyse=0x3:0x113/me=hex/subme=7/psy=1/psy_rd=1.00:0.00/mixed_ref=1/me_range=16/chroma_me=1/trellis=1/8x8dct=1/cqm=0/deadzone=21,11/fast_pskip=1/chroma_qp_offset=-2/threads=17/lookahead_threads=2/sliced_threads=0/nr=0/decimate=1/interlaced=0/bluray_compat=0/constrained_intra=0/bframes=3/b_pyramid=2/b_adapt=1/b_bias=0/direct=1/weightb=1/open_gop=0/weightp=2/keyint=75/keyint_min=7/scenecut=40/intra_refresh=0/rc_lookahead=40/rc=crf/mbtree=1/crf=26.0/qcomp=0.60/qpmin=0/qpmax=69/qpstep=4/vbv_maxrate=800/vbv_bufsize=1600/crf_max=0.0/nal_hrd=none/filler=0/ip_ratio=1.40/aq=1:1.00Codec配置框:av之中其中有几个非常重要的属性需要特别注意:我们下面列出的属性都是在其他条件不变的情况下,只改变当前属性比如Profile,我们要保证其他属性都一样,只有Profile不同,所以比较视频的质量是有意义的。3.1ProfileProfile对应上面的EncoderProfileLevel。一般情况下,ProfileLevel分为三种:BaselineProfileMainProfileHighProfile其中,BaselineProfile对应的是最低清晰度,Android3.0以后的版本才支持。MainProfile的定义高于BaselineProfile。挺好的,不过安卓7.0以后才支持。HighProfile的清晰度最高,Android7.0之后也支持。在设置EncoderProfileLevel之前,我们需要判断当前是否支持。3.2比特率视频比特率是视频数据传输过程中单位时间内传输的数据比特数。单位是kbps,顾名思义,码率越大,单位时间内填充的数据越多,视频质量就越高。码率并不是越高越好,码率设置超过一定大小,视频质量提升不明显,肉眼已经看不出差异,但视频大小会增加很多。所以只要设置合适的码率即可。推荐的码率计算方法通常为:Bitrate=width*height*frameRate*factorfactor=0.15根据以上公式设置的码率比较合适。当然,如果你想要更高清,可以适当增加factorsize。3.3码率模式虽然设置了码率,但码率描述的是一段时间内传输的平均数据比特数,并不能保证每个时间段内传输数据的大小是固定的或在固定的范围内.还有一个比特率模式参数来指示比特率模式。它也有三种类型:VBR:VariableBitrate(可变比特率),这种编码方式会根据帧间的数据变化量动态调整比特率,如果帧间的运动变化很大,就提高比特率,如果帧间的运动变化很大帧比较小,所以降低码率。从编码方式可以看出,这种编码方式有两个缺点:(1)运动预测计算算法比较耗时,编码时间比较长;(2)码率可变,最终生成的文件大小不可预测。它可以大也可以小。CBR:固定比特率或恒定比特率(ConstantBitrate),这是默认的编码方式,使用这种编码方式,文件的编码比特率会从头到尾固定或基本不变。这种方式的好处是文件大小是确定的,不会出现文件大小不可预知的情况。但缺点也很明显。有时帧间变化比较大,有时帧间变化比较小。如果使用相同的码率,帧间变化比较大的时候画质一般,帧间变化比较小的时候画质一般。显得很浪费。无法实现良好的平衡。ABR:平均码率(AverageBitrate),平均码率同时考虑了VBR和CBR,帧间变化比较大的时候使用较大的码率,帧间变化比较小的时候使用较小的码率码率,最终保证整体码率固定。更好地处理图像质量和文件大小之间的矛盾。但遗憾的是MediaCodec不支持ABR。如果我们要使用ABR模式,就需要使用软编码。MediaCodec也提供了三种模式:BITRATE_MODE_CQ:这种模式是为了充分考虑视频质量,尽可能保证视频质量,所以编码后的视频非常大,不可取。BITRATE_MODE_VBR:同上VBRBITRATE_MODE_CBR:同上CBR众所周知,硬编码比软编码快很多,所以编码首选硬编码,当硬编码失败时使用软编码来兼容。所以建议硬编码MediaCodec使用BITRATE_MODE_CBR模式,软编码切换到VBR模式。3.4B帧设置视频由三种视频帧组成:I帧、P帧和B帧。I帧是一个帧内图像帧,是一个关键帧,这意味着这一帧可以不依赖于其他帧进行编码或解码。P帧是前向预测图像帧,该帧需要参考其之前的I帧或P帧,以运动预测的方式进行帧间编码或解码。P帧的大小相当于I帧大小的1/10~1/20。B帧是双向预测图像帧。本帧需要参考它之前的I帧或P帧,也需要参考它之后的I帧或P帧,利用运动预测进行帧间预测编码或解码。GOP表示两个I帧之间的图像帧序列,GOP=2s表示两个I帧之间的间隔为2s。在Android平台上,只有部分高通芯片支持B-frame编码,而Android系统并没有开发设置B-frame的接口,所以使用AndroidMediaCodec编码的开发者无法开启B-frame编码(iOS是可以的,偷偷流泪)。当然,软编码可以设置B帧。设置B帧有什么好处?B帧的大小约为I帧大小的1/50。如果设置了B帧,清晰度不会降低,但是视频的尺寸可以大大减小,这样我们就可以相应的提高码率,最终达到提高清晰度的目的。当然,设置了B帧之后,编解码的复杂度就增加了,开发者在设置的时候一定要对此有充分的了解。4.HEVC编码目前,H.264编码仍然是应用最为广泛的编码方式。主要原因是H.264编码具有更好的兼容性,而且是免费开源的。HEVC自2013年第一个版本开源以来,并没有完全取代H.264(主要是收费,部分机型可能不支持),但HEVC也因其独特的优势得到了广泛的应用.HEVC相对于H.264的优势:HEVC标准视频的帧内预测模式支持33个方向,提供更好的运动补偿处理和矢量预测方法。而H.264只支持8种。HEVC采用块的四叉树划分结构,采用8x8~64x64像素的自适应块划分,而H.264的每个宏块大小固定为16x16像素。HEVC的这种设计可以保证宏块的大小可以在不同的帧间和帧内复杂度下动态调整。经过测试发现,在相同画质下,HEVC编码的视频比H.264编码的视频少40%左右。换句话说,如果HEVC与H.264具有相同的比特率,HEVC编码的视频比H.264编码的视频要清晰得多。从上图可以看出,对于相同的视频帧,HEVC使用的宏块比H.264少很多,体现了HEVC的优势。ResolutionH.264/AVCH.265/HEVC480p1.5Mbps0.75Mbps720p3Mbps1.5Mbps1080p6Mbps3Mbps4k32Mbps15Mbps使用MediaCodecHEVC硬编码时,我们需要检查当前是否支持HEVC编码。Android5.0已经支持HEVC。但是有些低端芯片可能还不支持HEVC,我们需要在编码前判断是否支持。使用HEVC编码可以保证在不增加文件大小的情况下,视频的清晰度得到大幅提升。上图是H.264编码,下图是HEVC编码。5.色彩调优以上几种优化方式都是在编码层面调整参数或者直接改变编码方式来提升视频的画质,但是有一种方法可以调整视频画面的色值——综合调整亮度、对比度以及色温、饱和度、锐度等色彩参数,进而对视频画面进行整体优化,让视频画面看起来“更清晰”。我们经常使用的颜色空间有RGB颜色空间、HSV颜色空间、YUV颜色空间和CIELab颜色空间,其中RGB颜色空间应用比较广泛。如上图所示,图像分为三个通道:R分量、G分量、B分量。每个分量的值是0到255。这三个分量共同构成了一种颜色的RGB值。RGB分量的值分布构成了颜色值的直方图,我们通过调整RGB值来调整图像的颜色。色值的调整有几种方式,对我们理解颜色调整有很大的帮助:亮度:亮度表示人眼实际感知到的发光体或物体表面的发光或反射光强度的物理量。被照亮的物体。总之,RGB分量越大,图像越亮;否则,图像越暗。对比度:图像对比度是指图像中从黑到白的渐变的灰度对比度或比率。对比度越大,比例越大,从视觉上看图像越清晰醒目,对比度越大;对比度越小,比值越小,图像越不清晰醒目,尘土飞扬的感觉越强,从视觉上看对比度越小。色温:色温与温度有一定关系,是指绝对黑体从绝对零加热后的颜色。从我们生活的角度来看,暖色看起来比较暖和,冷色感觉有点凉。饱和度:饱和度是指颜色的鲜艳度或纯度。饱和度越高,图像的色彩越鲜艳,色彩纯度越高;否则,它变得越低,直到灰度图像。锐度:锐度主要用来表示图像边缘的对比度。由于人的感知,清晰度高的图像看起来更清晰,图像上的细节对比非常明显。我们可以结合以上五种调整方法来调整图片的颜色。亮度增加10点(-100~100)色温增加5点(-100~100)饱和度增加20点(0~100)锐度增加15点(0~100)第一张图为原图,第二个是颜色调整后的输出图像。6.超分辨率算法上面提到的优化方法无论从编码层面还是颜色调整层面都是一种基本的优化方法。近年来,随着机器学习的普及,超分辨率算法在图像中的应用越来越广泛。视频处理出现了。超分辨率是指通过机器学习对图像进行重构,达到提高图像分辨率的效果。目前比较成熟的超分辨率技术是Real-ESRGAN,它基于BasicSR,采用ESRGAN算法,利用机器学习的优势,对图片和视频进行去模糊、resize、降噪、锐化等处理,重构图片,实现图片的超分辨率。分辨率处理。E-SR-GAN算法的三个步骤:特征提取:计算噪声非线性映射:放大、模糊噪声图像重建:差值、平滑过渡、去噪与之前的SRCNN等超分辨率算法相比,有以下几点已改进:改进感知损失以改进输出图像的边缘清晰度和纹理真实感。利用对抗网络的优势不断反馈改进GAN鉴别器,预测高分辨率图像与之前原始图像的相对真实性而非绝对真实性。可以还原原始图像的真实纹理细节。优化了模型的稳定性。每一张生成的图片都与原图的残差进行对比进行校正训练,最终的结果非常稳定。以下是超分辨率前后的对比结果:可以点击大图进行细节对比。可以看到超分辨率后的画面细腻了很多,去除了模糊的部分,画面的噪点也减少了。7.总结本文结合当前视频的痛点(清晰度问题),提出了衡量视频清晰度的标准——主观标准和客观标准,明确了视频清晰度的优化目标和方向。根据视频的基本特性(码率、GOP、编码方式等)提出基本优化方法,在基本优化的基础上提出高级编码方法(相比H.264编码方法),然后结合目前主流的视频色彩滤镜,提出视频色彩优化方案,让视频看起来更清晰。终极杀手锏——超分辨率算法采用E-SR-GAN方法放大、降噪、重构帧,提升视频清晰度。希望以上方法能给大家带来一些帮助,对提高视频清晰度有更进一步的思考。参考文章:VMAF开源项目https://github.com/Netflix/vmaf揭秘VMAF视频质量评估标准https://xie.infoq.cn/article/...NetflixVMAF视频质量评估工具概述https://zhuanlan.zhihu.com/p/...B帧对视频清晰度/码率的影响https://blog.csdn.net/matrix_...H264vsH265https://www.cnblogs.com/wujia...超分离开源项目https://github.com/xinntao/Re...*text/JeffMony关注得悟技术,每周一、三、五晚18:30更新技术。如果觉得文章对你有帮助,欢迎评论转发点赞~
