文档章节

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

七牛云
 七牛云
发布于 2017/05/25 14:08
字数 1623
阅读 21
收藏 0
点赞 0
评论 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
博文 60
码字总数 109690
作品 0
浦东
无用的设计模式之命令模式

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

xpbob ⋅ 2016/04/15 ⋅ 0

C语言实现一个战争游戏的模拟

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

汤浩永 ⋅ 2011/07/20 ⋅ 10

【步兵 cocos2dx】lua绑定

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

id___e_o_s___ ⋅ 2017/05/30 ⋅ 0

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

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

tinywan1227 ⋅ 2017/01/12 ⋅ 0

[古言]经世流年杨家将(80)

图片发自简书App 第八十章:明修栈道暗渡陈仓 文|唐朝李白 益津关,瓦桥关,雁门关皆被辽军围的水泄不通,探子竟找不到一丝口子混入。城中燃起烽火,定是出事无疑,到底出了何事,却无从深知...

唐朝李白 ⋅ 03/06 ⋅ 0

[古言]经世流年杨家将(76)

图片发自简书App 第七十六章:瓦桥关血战赢大胜 远处烟尘翻滚,地动山摇,城墙的青砖都在颤动。六郎立时下了城楼,组织人马出城迎敌! 战鼓号角长鸣,一声巨响,城门大开,泛起黄土,飞飞扬扬...

唐朝李白 ⋅ 02/04 ⋅ 0

【系列】序—直播疑难杂症排查

在七牛做直播 SDK 一年多了,帮助客户解决过各种形形色色的问题,如直播卡顿、马赛克、花屏、黑屏、杂音、音画不同步等等等等,这其中,有一些是网络原因,有一些是客户的使用姿势问题,有一...

七仙女很忙 ⋅ 2017/04/13 ⋅ 0

又是晚上 10 点,微信小程序「放码」

从上周五支持「长按二维码打开小程序后」,微信小程序似乎进入了鸡血状态,大招不断。 昨上晚上 10 点多,微信放出「第三方平台支持小程序」后,今天,也是晚上 10 点多,微信放出了「小程序...

达尔文 ⋅ 2017/04/19 ⋅ 26

Photoshop怎么实现图片局部马赛克

学好ps是一件很重要的事情,作为日常必备技能,不管是在遇到这样的同时请求帮忙或者老板发配的任务的时候,就能分分钟派上用场了。 1:安装运行photoshop,点击文件-打开,选择要ps的图片。 ...

祈澈姑娘 ⋅ 03/19 ⋅ 0

两把王者荣耀的时间学会Python图片打码技能——「实验一小时」今晚开启!

关注「实验楼」,每天分享一个项目教程 「 实验一小时 」今晚开启,实验楼技术天团带你一小时做一个项目。 今晚 7:30 ,曾任职于腾讯、盛大等一线互联网公司的天火老师,将在B站带来免费直播...

moy37rqw1jarn33bgzk ⋅ 04/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Netweaver和SAP云平台的quota管理

Netweaver 以需要为一个用户上下文(User Context)能够在SAP extended memory区域中分配内存尺寸创建quota为例。 对于Dialog工作进程,使用事务码修改参数 ztta/roll_extension_dia. 对于非D...

JerryWang_SAP ⋅ 22分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 31分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 55分钟前 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

Yii2中findAll()的正确使用姿势/返回为空的处理办法

从一次错误的操作开始 $buildingObject = Building::findAll("status=1"); 1 这个调用看着没有任何毛病,但是在使用时返回的结果却是一个空数组。再回过头来看看数据表中: 按照套路来讲,查...

dragon_tech ⋅ 今天 ⋅ 0

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部