文档章节

骑兵变步兵?10 分钟搞明白如何在直播中去马赛克

七牛云
 七牛云
发布于 2017/05/25 14:08
字数 1623
阅读 22
收藏 0

 

「马赛克」被很多人称为是一种罪恶的发明,除了应用在某种不可明说的场景中,在直播过程中的马赛克却有很多技术原因,这篇文章将全方位为你解决直播中的「下马」问题。

 

《直播技术详解》系列文章之后,我们推出了这个新的系列《直播疑难杂症排查》,把解决直播问题的经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,希望能够帮助到直播领域的开发者们。

 

 

本系列会涵盖的内容包括但不限于如下一些主题:

本文是 《直播疑难杂症排查》系列的第六篇文章,我们重点来看看直播中常见的马赛克问题。

 

马赛克问题的表现

 

马赛克主要是指画面中出现多处类似小方块的图像,导致画面的局部或者整体看不清楚的情况。

 

 

 

马赛克严重的问题排查

 

1.视频编码参数配置原因

 

视频的画质,是由它的编码质量决定的,压缩得越「厉害」,画质损失就越严重,马赛克就越多。

 

  • 哪些关键因素决定了编码器的压缩质量呢 ?

 

编码器最重要的五个参数:画质级别、码率、帧率、GOP 大小、码控方式

 

画质级别:H.264 有四种画质级别,Baseline profile,Extended profile,Main profile,High profile。级别越高,压缩的效果越好,但算法复杂度更高,导致功耗也更高。

 

码率:决定了视频被压缩的程度,码率越低,丢失的信息也就越多,画质也就越差。但是,带来的好处是占用的网络带宽会比较小,容易在互联网上传输,不容易出现卡顿。

 

帧率:决定了视频的流畅性,帧率越高,视频越流畅,但每秒钟编码器要处理的数据量也就越大,同等码率下压缩出来的视频质量就越差。

 

GOP 大小:决定了视频的延时,GOP 越小,延时就越小,但 GOP 小带来的问题是关键帧数量多,数据量变大,因此,同等码率下压缩出来的视频质量就会越差。

 

码控方式:一般编码器都有固定码率(CBR) 和 动态码率(VBR) 两种码控方式,前者是指码率优先,为了保证码率尽可能稳定,会主动降低画质,因此容易出现马赛克,后者是指画质优先,会优先保证画质,减少马赛克,但码率会浮动很大。

 

当然,还有一个重要的因素,就是编码器本身的实现质量,软编一般可以保证在不同手机上效果一致,而硬编则完全依赖手机所使用的硬件平台了。

 

  • 推荐的编码器参数配置

 

一般直播场景中,考虑到手机性能和功耗,一般画质级别采用的是 Baseline profile,GOP 通常设置为 1~3s,帧率一般在 15~24 帧,而码率的配置,则需要根据推流的分辨率来决定,推荐的分辨率和码率配置关系如下图所示(来自:《Video Encoding Settings for H.264 Excellence》)。

 

 

 

总之,关于视频编码与马赛克的关系,我们只需要记住一个原则:送入编码器的数据量越大,编码压缩得越「厉害」,丢失的图像信息也就越多,数据解码后的产生马赛克也就越「厉害」。

 

2.图像尺寸原因

 

一般摄像头采集的图像分辨率,跟最终推流的尺寸不一定完全匹配,当摄像头采集的分辨率大于推流尺寸的时候,需要先对画面进行 「剪裁」处理,而当摄像头采集的分辨率大于推流尺寸的时候,则需要先对画面进行「拉伸」处理,然后再送入编码器中编码压缩。

 

 

 

 

例如:小尺寸的画面(比如:640 x 480),拉伸到大的尺寸(比如:1280 x 720),则很容易会产生模糊和马赛克,这样的画面再送入编码器中编码,无论怎样配置都无法再改善已经产生的马赛克了。

 

所以,为了降低马赛克,我们必须要保证,摄像头采集的分辨率,一定要大于最终推流的分辨率。

 

 

3.客观条件原因

 

如果主播在光线非常暗的环境下,本身送入编码器的图像质量也不会特别好,因此,同等条件下马赛克也会相对严重些。

 

同样,如果拍摄的是剧烈晃动的画面,剧烈变化的画面信息量也要大很多,因此,编码的复杂度会明显增大,如果要保证码率不会浮动太大,就必然要降低输出的图像质量,从而产生马赛克现象。

 

如果直播应用是主打这种光线暗的场景或者剧烈运动的画面场景的话,为了降低马赛克,可以考虑适当将编码参数配置得「高」 一点(比如:码率高一点,帧率低一点等等),留出充分的 「富余」空间,以抵抗环境因素带来的影响。

 

4.关键帧丢失

 

还有一种马赛克现象,是由于视频流中丢失了关键帧,导致播放器解码后花屏,从现象来看有点像马赛克,但实际上跟上面讨论的不是同一个问题,我们将在后续的文章中专门讨论这个花屏问题。

 

七牛直播云在 2016 年 6 月发布之后,已帮助客户如熊猫TV、龙珠直播等解决过形形色色的问题,我们很乐意广大技术人与公司能够通过我们的经验分享,避免不必要的开发。

 

关注公众号 七 牛 云,第一时间聆听「播放黑屏、花屏、绿屏」的经验!

© 著作权归作者所有

共有 人打赏支持
七牛云
粉丝 39
博文 70
码字总数 154060
作品 0
浦东
无用的设计模式之命令模式

前言 本文不是主要介绍什么是命令模式,而是对命令模式在使用上的一种思考,想看模式介绍的话,估计你要失望了。但是你起码得知道什么是命令模式吧,要不接下来要被误导了。 从类图出发 我们...

xpbob
2016/04/15
99
0
C语言实现一个战争游戏的模拟

现在公司准备出一款中世纪背景的战略游戏。 主要兵种有骑士,弓箭手,步兵。 每个兵种有血(80-200),防御(0-5),攻击力(8-20),造价(50-200)等基本数据 (可选射程,速度也可以增加其他属性)...

汤浩永
2011/07/20
1K
10
【步兵 cocos2dx】lua绑定

【步兵 cocos2dx】lua绑定 By EOS. 最近想搞一搞自动化测试,涉及到luabinding,简单的写一篇教程。 不过并不打算写很仔细,因为这种东西网上太多一搜一大片。 刚刚实现了模拟点击,绑定到l...

id___e_o_s___
2017/05/30
0
0
流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系

源码地址:https://github.com/Tinywan/PHP_Experience   很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参数到底是干什么的,...

tinywan1227
2017/01/12
0
0
《战争论》第五篇《军队》的主要内容

《战争论》第五篇《军队》的主要内容 《军队》是《战争论》的第五篇,主要论述了四个部分,包括兵力和编成、战斗外活动、给养和地形(如图1所示)。 图1 《军队》的主要原则 《战争论》写道:...

可量化
05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
21分钟前
0
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
23分钟前
0
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
36分钟前
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
1
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部