问题背景:
最近我们做了一个小项目,通过对接亚马逊的开放API,将智能家居中的自营摄像头视频可以投屏到Alexa智能音箱上,可以对着喊一句:alexa,open the door。就可以将安装在门外的摄像头唤醒,然后观看视频直播。
这即丰富了智能家居落地场景,也解放了双手,不用再打开APP查看云存储视频和直播了。
但是在排查客户问题过程中国,发现有一款摄像头的视频,如果画面静止不动播放就很流畅,画面清晰,但是一旦有人经过或者背景剧烈运动,就出现马赛克,非常糊,进而需要定位下是网络原因还是码流自身原因。
排查手段:
1. 网络原因首先排除掉了,因为如果是网络原因不至于这么巧,每次都是画面刚一动就播放马赛克,实际用另外一款摄像头也做了对比试验,其它摄像头就不会出现此类问题。同时由于整个链路也有日志,通过日志没发现这块有问题。
2. 既然网络原因引起的概率比较小,那再锁定问题是码流问题,由于播放视频的是第三方客户端Alexa智能音箱,想通过客户端入手排查比较困难,所以选择在服务端写码流形式,我在服务端将摄像头吐出来的H.264码流写下来。
3. 顺便分析了码流里面的时间戳,打印都比较规范也没发现明显问题,应该就是摄像头编码器吐出来的数据原始流有问题。
4. 仔细观察裸流播放情况,发现了两个现象,一个是花屏的帧数据有比较明显的方块效应,其次也具备明显的呼吸效应(见后面解释)
5.猜测估计是摄像头编解码参数应该设置的固定码率,了解编码的同学应该知道,当画面的运动量比较大,那么视频编码出来的数据量就会比较大。如果采用定码率,这个时候为了高的压缩率则会看到量化值QP比较大,所以我只要确认设备端是不是设置了这种编码方式,其次解码看下花屏马赛克比较大的帧对应的宏块QP值是不是比较大即可,一般会超过40多。
A.进入摄像机后台发现红框这里填写的固定码率,最高码率是1Mb
B. 解码写下来的裸流H.264对应静态画面的QP值和剧烈运动出现花屏部分的QP值
我们发现画面静止不动时QP值基本就在30-35之间,然后出现方块效应时:
QP值基本已经超过了45,因为在固定码率情况下,画面剧烈运动产生编码数据量大,如果为了保证编码器产生固定码率,则此时的量化系数肯定比较高,这里也验证了前面的猜想。
知识拓展:
1.方块效应&呼吸效应
这种问题可能对于播放器编解码同学可能一眼就看出来了,搞传输和封装同学只是看到花屏或者比较糊有马赛克现象,一般会怀疑丢帧和时间戳的问题,之所以没排查丢帧是因为我们整个链路用的TCP。其实马赛克比较糊的画面仔细观察还是能进一步区分是不是有呼吸效应和方块效应:
方块效应:主要是由视频图像采用基于块的编码方式和量化造成相邻块之间存在明显差异的现象,在视频编码中人眼察觉到的小块边界处的不连续。简单说就是视频编码的最小单元不是帧是宏块,每个宏块可能编码细节处理不一样,这样解码出来会发现视频中出问题总是一小块一小块的,一帧画面出现马赛克的地方有些区域很严重有些则能好点。
呼吸效应:视频编码中的呼吸效应是指由于I帧的插入造成图像质量忽然变好,切换到P帧后又忽然变差,特别是在画面静态时,如果周期性的出现则容易发现这个问题。
2.编码流控策略
以上问题的排查结论建立在一个重要基础上,就是编码端的摄像机采用了固定码率,如果不是这种情况,并不是说QP值越大一定就会造成花屏马赛克。一般编码器编码数据往往在这三个因素里面取平衡点:编码的图像质量、编码速度(计算复杂度)会影响延时、编码的码率。要想编码图像质量很高,我们可以采用高分辨率,提高帧率,压缩率低点,但是这样码率肯定会提高,给传输带宽和存储带来压力,如果加快编码,码率低点,往往会质量变低,所以一般都要根据不同的使用场景来优化编码器参数,调整编码动作,在体验感满足情况下,尽可能降低传输带宽和提升编码速度。
为了在上述三个因素取得平衡:编码的图像质量、编码速度(计算复杂度)会影响延时、编码的码率,于是产生了下面几种调控码率的策略,以常见的x264编码器为例:
CQ:Constants Quantize
1. CQ 方式它表示完全不控制码率,尽最大可能保证图像质量,对于质量要求高、不在乎带宽(例如本地存文件)、解码器支持码率剧烈波动的情况,显然 CQ 是不二之选;
CBR:Constants Bits Rate, 静态比特率
2.CBR 它表示编码器会尽量把输出码率控制为设定值,使用CBR编码时,比特率在流的进行过程中基本保持恒定并且接近目标比特率,始终处于由缓冲区大小确定的时间窗内。CBR编码的缺点在于编码内容的质量不稳定。因为内容的某些片段要比其他片段更难压缩,所以CBR流的某些部分质量就比其他部分差。此外,CBR编码会导致相邻流的质量不同。通常在较低比特率下,质量的变化会更加明显,所以这种情况适用于流媒体传输,对带宽有严格要求的适合这种编码方式,缺点就是画面剧烈变化时,视频质量下降比较明显,如果是长时间静态画面这种,也有点浪费带宽。
VBR:Variable Bit Rate,动态比特率。
2. VBR 它表示编码器会根据图像内容的复杂度(实际上是帧间变化量的大小)来动态调整输出码率,图像复杂则码率高,图像简单则码率低。输出码率会在一定范围内波动,对于小幅晃动,方块效应会有所改善,但对长时间剧烈晃动仍无能为力。这种编码方式适用于本地存储本地编码这种情况对视频和音频质量要求比较高但是又不关心带宽的场景可以采用该编码方式。
3. 量化参数:
量化在编码中处于的位置:
了解量化参数应该对编码的基本流程有一个了解,其中这种图网上很多:
编码我们一般采用就是两种思想,在空间域上采用帧内压缩,利用数据的空间相关性进行压缩,这种压缩思想实现基本就是图片的压缩算法。另外一种就是一种利用时域的数据相关性进行压缩,采用参考参考帧和预测帧之间的宏块计算残差在此基础上进行压缩。如上图所示,一般用“残差”Dn 来表示当前块和参考块之间的误差。将残差 Dn 进一步进行离散余弦变换 DCT后对变换系数进行量化可以进一步压缩数据量。其中该压缩过程是有损的,一般地随着量化参数QP的扩大,图像的损失将变大。解码过程需要进行一次反量化-反变换IDCT 还原残差,后再根据参考宏块还原原始图像。
量化的目的:
量化是在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。H264采用标量量化技术,它将每个图像样点编码映射成较小的数值。
实际上现有的码率控制算法主要是通过调整离散余弦变换的量化参数大小输出目标码 率。实际上,量化参数(QP)反映了空间细节压缩情况,如 QP 小,大部分的细节都会被保留,码 率增大。QP 增大,一些细节丢失,码率降低,但图像失真加强和质量下降。也就是说,QP 和比特率成反比的关系,而且随着视频源复杂度的提高,这种反比关系会更明显。
量化参数取值:
A. 化参数QP是量化步长Qstep的序号。对于亮度(Luma)编码而言,量化步长Qstep共有52个值,QP取值0~51,对于色度(Chroma)编码,Q的取值0~39。
B. QP取最小值0 时,表示量化最精细;相反,QP取最大值51时,表示量化是最粗糙的。
C. QP和Qstep具有线性相关性,Qstep随着QP的增加而增加,每当QP值增加6,Qstep便增加一倍。
总结:
今天这篇文章其实也是自己补充了编码方面的一些基础知识,从一个简单问题排查入手,学习了量化参数的含义,其次了解了量化参数如何平衡了编码码率、编码复杂度和编码图像质量。