H264马赛克、延时的优化

        最近将前几年做无人机图传时代码翻出来看了看,发现当时虽然做的比较肤浅,不过对于h264视频流的优化方面,还是有一定借鉴意义的。

        当时的应用场景是这样的,无人机上当做服务端,用rtsp往外广播无人机摄像头采集到的视频流。再用一台或多台手机当成客户端,用rtsp协议来接收视频流并播放。我们这里不讨论rtsp协议,只说下h264的优化方案。

        因为无人机和手机之间距离影响的原因,飞得越远,wifi信号越弱。且无人机飞行时,camera镜头一直在晃动,采集到的图像变化很大,导致手机或电脑端预览画面会有严重的马赛克,以及图像会变得相当的模糊。

        针对这种带宽不足,且是运动的场景,当时做了一些优化,先列举出来,供大家参考。

1.)去掉b帧(双向预测帧),只用I帧和P帧,可以节省编码时间,在图传中可以减少延时。但因为缺少了向后预测对比,画质会比有B帧的要模糊。(提升速度,晃动时延时可以减少100毫秒)

2.)启用FMO,即灵活的宏块次序。误码方式之一。将宏块顺序打乱组成新的slice编码和打包传输。当某个Slice丢失而其他 slice数据正确接收的情况下,解码器可以利用相邻的宏块数据掩盖丢失的宏块,以提高解码端图像恢复效果。(去马赛克)

3.)关闭RS冗余块。当打开冗余块时,允许编码器发送图像某些区域的冗余编码数据,这样当基本编码数据在传输过程丢失时,仍可以显示图像某些区域。例如,一个较清晰的slice附加一个较模糊的slice,当解码器基本slice可用时,解码器丢掉冗余slice,只对基本slice解码。当基本slice丢失时,就可以使用冗余slice解码。不过这样一来,应该会增强网络带宽的负担。所以网络不好时,要把它关了(提升速度。如果不管网络,打开它可以提升清晰度)

4.)启用去方块、马赛克环形滤波(去马赛克)

5.)启用RVLC反向变长编码,开启它后当解码发生错误时,不会将所有比特都丢掉重新同步,而是只丢掉错误的,这样影响的区域将会变小(去马赛克)

6.)启用帧内预测。这样当前帧出现马赛克时,不会传染到后面的帧。

但是要模糊些。 当用帧间预测时,编码的宏块只能用邻近帧内编码的宏块的像素作为自己的预测,要清晰些,但是有马赛克时,会传染,并且很难恢复(去马赛克)

7.)把量化值设小一点。量化值越小,数据量越大。 量化是在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。H264采用标量量化技术,它将每个图像样点编码映射成较小的数值。QP值对应量化步长的序号,对于亮度而言,此值范围为0~51 。值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能会更大。QP值每增加6,量化步长就增加一倍。(去模糊)

8.)减少I帧个数。这个可能是大家都没想到的,按常理来讲,I帧越多,图像不是越清晰么?但是不要忘记了,我们的带宽有限。I帧多了,自然会压缩其他的P帧,分配到p帧的数据就少了,自然就会更模糊了。(去马赛克)

9.)采用动态码率VBR 输出码率会在一定范围内波动,对于小幅晃动,方块效应会有所改善,但对剧烈晃动仍无能为力(去马赛克)

 

 

花屏/绿屏的原因

播放画面出现图像紊乱,像被刮花了一样。大面积的异常颜色的方块图,绿屏或其他颜色现象

丢失参考帧或者b帧p帧上的数据丢失导致, I 帧由于是帧内压缩,因此可以独立解码播放,而 B 帧,一旦丢失了 I 帧或者后面的 P 帧,则会解码失败,而 P 帧一旦丢失了前面的 I/B/P 帧,也会导致解码失败。不要丢弃编码后、解码前的视频帧数据,实在要丢,一次丢一整个 GOP(一个I帧到下一个I帧中间的数据)

你可能感兴趣的:(流媒体,颜色编码,android)