如何解决直播中黑屏、花屏、闪屏问题?10 分钟搞明白
- 播放失败
- 直播卡顿
- 首开慢
- 延时高
- 音画不同步
- 马赛克严重
- 播放黑屏、花屏、绿屏
- 播放杂音、噪音、回声
- 点播拖动不准
- 直播发热问题
- 其他问题(待续)
首先我们要明白,黑屏、花屏、闪屏等问题,可能是推流端的问题,也可能是播放器的问题,遇到这些现象,我们要第一时间用别的播放器(如 VLC,ffplay)试试,如果都出现同样的问题,那么多半是流本身的问题了,反之,则很可能是播放器的问题。
播放黑屏
现象:画面是黑的,没有图像,但是有声音。
1.主播端摄像头权限问题
无论 Android 还是 iOS,App 使用摄像头都是需要申请授权的,特别是 Android 6.0 以后,如果 App 层面不做专门的处理的话,很可能出现摄像头权限被禁用的情况。
如果 App 没有获取到摄像头权限,视频就无法采集成功,从而导致推出来的流只有音频数据。
解决方案:App 层面肯定要小心处理权限问题,检测到未获取相应权限则禁止开播,或者反复提示主播授予权限。另外,可以询问出现问题的主播是否有摄像头预览画面,如果 App 没有获得权限的话,是没有预览画面的。
2.主播端编码失败
视频数据采集到后,下一步就是经过编码器,由于参数配置或者某些机型的硬编兼容性问题,很可能数据送入编码器后,编码失败,并无输出,从而导致没有视频数据送入到推流模块。
解决方案:一般推流 SDK 都会统计推流的实时视频帧率,CDN 服务端也会有一些帧率监控,因此,如果发现这些统计得到的推流帧率为 0,同时又确定不是没有采集到数据,那么多半是编码器的原因,可以想办法查看下该机型的日志看看具体的报错信息。
3.视频解码失败
前面的文章有提到过,当播放器遇到不支持的视频格式,或者数据内容/格式异常,则会解码失败,从而导致无解码视频输出。
针对不支持的格式:
要提前了解播放器本身支持哪些音视频格式,如 H.264,mp4v,aac 等等,避免播放不支持的格式
播放器本身遇到的硬解或者软解失败,应该有日志报错,或者抛出异常给应用层提示用户
针对视频数据内容错误:需要分析码流文件本身,常见的数据内容错误导致的解码失败有如下几种:
送入解码器的帧数据不完整
H.264 的视频码流,缺失了 SPS,PPS 等必要的信息头
iOS 的 VideoToolbox 解码,只支持 avcc 方式打包的 H.264 数据
部分 Android 机型硬编出来的数据有额外的 naul 头
其他等等
4.码流的前半段只有音频没有视频
这种情况,多半出自 HLS 切片产生的码流,当主播用同一个地址推流,前半段只推了音频(可能是摄像头权限被禁用,也可能是选择了纯音频推流等等),然后接着又同时推了音视频流,那么,服务端 HLS 切片产生的文件,就会出现这样的情况。
基于 ffmpeg 的播放器,会在解析完视频头后初始化解码器,因此,对于这种码流,往往会出现仅有音频或者仅有视频播放的情况。
解决方案:从 App 端尽可能避免出现这种使用姿势,修改播放器的代码,对这种码流进行兼容处理。
播放花屏/绿屏
花屏
花屏主要分为整个画面都花屏或局部花屏两种情况。
全屏花屏
- 正常花屏
有一种花屏是正常的,就是码率特别低的时候出现的大面积马赛克,我们俗称"画面糊了"。
比如我们告诉视频编码器要输出1280 720高清分辨率的画面,但同时要求它只用 200 kbps的码率*(码率是指编码器每秒产生的视频数据大小 ),编码器此时能做的事情就是无底线地降低画质,就会导致大面积的马赛克。
视频参数问题
比如当视频源修改过视频参数(如从720P修改1080P),此时客户端用于解码的SPS&PPS如果没有重新获取的话,就会出现整个画面花屏的现象。这种花屏的现象会一直持续下去,不会随着时间而恢复正常画面。视频参数变化 导致全屏花屏或绿屏
局部花屏
- SO_SNDBUF的Buffer太小
当流媒体服务器的SO_SNDBUF的Buffer太小, 在网络环境不好时,导致部分直播数据丢失(比如丢失P帧),继而会导致部分花屏的现象。
解决方法:
增加SO_SNDBUF的Buffer大小。
SOCKET sSocket = ......int nRcvBufferLen = 1024*1024;int nSndBufferLen = 4*1024*1024;int nLen = sizeof(int);setsockopt(sSocket, SOL_SOCKET, SO_SNDBUF, (char*)&nSndBufferLen, nLen);setsockopt(sSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nRcvBufferLen, nLen);
- P帧丢失
I帧正常丢失P帧的情况下,画面的大部分区域是正常的,只有在发生变化的那部分区域会存在局部花屏。
绿屏
产生绿屏的主要是: 无法渲染的画面有些用黑色填充,有些用绿色填充,有些用上一帧画面填充。
视频参数改变, 而解码端的SPS&PPS信息未及时重新获取更新,会导致画面无法正常渲染,继而导致绿屏的现象出现。
References:
https://com123.kf5.com/hc/kb/article/1028720/
http://www.itnotepad.cn/Home/Article/num/136.html
--------------------------------------------------------------------------------------------------------------------------------------
现象:播放画面出现图像紊乱,大面积的异常颜色的方块图,或者绿屏现象
1.丢失参考帧导致的
一般 H.264 码流有 I、B、P 三种帧类型,I 帧是关键帧,B 帧是双向预测内插编码帧,P 帧是前向预测编码帧。
I 帧由于是帧内压缩,因此可以独立解码播放,而 B 帧,一旦丢失了 I 帧或者后面的 P 帧,则会解码失败,而 P 帧一旦丢失了前面的 I/B/P 帧,也会导致解码失败。
对于丢失了参考帧而导致的解码失败,一般就会出现花屏的现象,花屏的严重程度依赖于丢失的参考帧对即将解码的帧的重要程度。
那么,什么情况下会丢失参考帧呢 ?
首先,推流/播放的代码层面,需要注意,不要丢弃编码后、解码前的视频帧数据,不过实际场景中,遇到下面的情况,难免还是会产生丢帧:
网络不好,编码后的数据发不出去
系统低内存,队列里面无法承受更多的帧数据
因此,在这些极端的情况下,不得不丢帧的话,最合理的策略就应该是一次丢一整个 GOP,即:一旦开始丢了一个 I 帧,那么在遇到下一个 I 帧之前的所有视频帧,均丢弃掉,这样即可有效避免播放器端产生解码花屏。
2.播放器没有从关键帧开始解码
原理依然如上面所述,如果不从关键帧开始解码,则必然会由于丢失了参考信息而导致解码花屏。
因此,播放器,无论是首播,还是断网重连后,都应该判断第一帧视频是否是关键帧,如果不是,则应该等到第一个关键帧到达之后再送入解码器。
基于 ffmpeg 的播放器,如何判断关键帧,可以参考文章:《FFMPEG Tips (3) 如何读取每一帧的信息》
3.码流中视频尺寸发生变化
很多直播 App,横屏直播和竖屏直播,使用的是不同的推流尺寸 ,当主播由竖屏推流改为横屏推流,同时又不改变推流地址的话,观众端拉到的流就会出现中间发生了视频尺寸的变化,比如:从 848 x 480 变成了 1280 x 720 等等。
播放器需要实时检测,如果发现视频尺寸发生了变化,则需要重置解码器以及相关逻辑,否则容易出现解码花屏或者出现内存越界等异常。
4.硬编硬解的兼容性问题
当然,如果使用的是 Android 硬编硬解,则难免会遇到一些比较坑爹的手机,硬编硬解没有失败报错,但是输出的图像确实异常的情况。
Android 硬编硬解的兼容性问题,代码上小心仔细,充分考虑机型的兼容性,不轻易写死任何参数,剩下能做的就是靠白名单/黑名单了。
5.推流端图像尺寸和格式处理不当
图像的格式和尺寸,都是非常重要的参数,一定要严格配置正确。
比如:如果采集到的视频是 NV21 ,编码器只支持 I420,那么编码出来的图像自然会出现颜色问题。
比如:在一些场景切换的过程中,前后摄像头切换,视频的尺寸可能发生了变化,但是剪裁、处理、编码模块没有相应的修改尺寸,那么,也会出现各种视频错乱的现象。
播放闪屏
闪屏问题,从根源来看,就是播放的过程中,出现了两种不同的画面来回切换,从而看起来像 「闪屏」,比如,黑白两张图片交替渲染。下面我们再来看看直播场景下,什么原因会引发该现象。
1.播放器缓冲机制原因
网络不好的时候,播放器会频繁缓冲,曾遇到过一种案例,就是某直播 App 应用,在缓冲的时候,使用了一张广告图片,在某种极端弱网情况下,由于频繁缓冲,导致真实的播放画面和广告图片来回快速切换,导致闪屏现象。
这个情况是完全可以从播放器的缓冲策略上避免的,每次缓冲后,不要收到一帧后就立即渲染,而是适当地多缓冲一些数据,再发送缓冲结束的消息,从而可以频繁 ms 级别的缓冲切换产生的闪屏。
2.推流端的原因
推流端产生闪屏的流,往往发生在有画面合成的代码模块,比如:叠加水印、摄像头/图片切换推流、连麦合流等等。
画面的合成,一定要铭记一点,任何情况下,都要避免出现,有合成/没有合成两种画面的交替。
如何解决直播中黑屏、花屏、闪屏问题?10 分钟搞明白相关推荐
- 用户的眼睛没毛病!10 分钟搞明白如何在直播中解决黑屏、花屏、闪屏问题
「黑屏.花屏.闪屏」经常出现在直播应用中,除了网络问题,在直播过程中的黑屏.花屏.闪屏却有很多技术原因,这篇文章将全方位为你解决直播中的「黑屏.花屏.闪屏」问题. 继<直播技术详解>系列文 ...
- 骑兵变步兵?10 分钟搞明白如何在直播中去马赛克
「马赛克」被很多人称为是一种罪恶的发明,除了应用在某种不可明说的场景中,在直播过程中的马赛克却有很多技术原因,这篇文章将全方位为你解决直播中的「下马」问题. 继<直播技术详解>系列文章之后 ...
- 惠普计算机开机半花屏,惠普笔记本闪屏_惠普笔记本闪屏黑屏花屏现象,如何解决...
惠普笔记本偶尔闪屏 控制面板中打开"电源选项" 改完之后应用即可. 惠普笔记本老是闪屏怎么办啊 这个闪屏门和灯管有问题都可能.如果是14寸宽屏的就下个鲁大师看看屏幕是不是LG的 是 ...
- android 快速亮暗屏_Android设备闪屏怎么办?手机屏幕一会亮一会暗怎么办
展开全部 闪屏问62616964757a686964616fe78988e69d8331333365646335题作为Android的一类常见问题,原因复杂多样.我们在这里整理一下如何分析闪屏问题,找 ...
- [转载]如何解决直播中的播放杂音、噪音、回声问题 | 直播疑难杂症排查
继<直播技术详解>系列文章之后,我们推出了这个新的系列<直播疑难杂症排查>,把解决直播问题的经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,希望能够帮助到直播 ...
- 解决在硬件加速下WebView切换闪屏的问题
问题描述 在利用WebView进行开发时,遇到了这样一个问题,即在两个Fragment中分别嵌入两个WebView,切换Fragment时,页面会闪烁并伴随有黑块,用户体验非常糟糕. 解决历程 遇到问 ...
- unity发布安卓黑屏_untiy3dAndroid和ios启动游戏黑屏界面增加闪屏处理
第一种方式,SDK做,走原生Android流程,百度很多,不介绍了,缺点不方便,优点嘛,没找到.... 第二种方式,unity自带的开机静态图片,具体如下: 1.Android image.png i ...
- C# 解决LISTVIEW控件显示数据出现闪屏的问题
本文转自:https://www.cnblogs.com/yangxuli/p/7595794.html,为了尊重作者原创,转载请注明出处. 一.发现问题 如果发送数据过快的情况下,ListVies滚 ...
- 为什么mysql打开闪屏_mysql登录闪屏问题解决办法
Mysql安装后打开MySQL Command Line Client闪退解决方法 //MySQL的启动方法,先在DOS下切换到mysql的安装目录BIN下然后输入启动mysql服务的命令, 再然后在 ...
最新文章
- Floating-Rate Note - FRN
- ubuntu 14.04中文显示乱码问题
- java某个参数值设置为空_@PathVariable为空时指定默认值的操作
- 各个浏览器兼容性问题积累
- AD17 保存PCB文件时提示失败
- linux zsh 终端,linux 终端命令加速-zsh让终端更优雅
- 身神话继续遭受DDOS进攻,也遭受了雷同的陵犯
- 解决git未指定冲突处理方法的问题 - hint: Pulling without specifying how to reconcile divergent branches ishint: di
- bochs镜像java模拟器_bochs WIN7 IMG镜像文件
- Mac 下解压Android NDK 的 .bin文件
- 中国大陆加港澳台手机正则验证
- 在电脑上微信无法语音聊天,微信听不到语音声音
- uva 10041 - Vito's Family
- Html+css怎样实现纯文字和带图标的按钮
- 电子科大2020计算机考研真题,2021电子科技大学考研历年真题复习资料
- 前端学习——vue基础知识
- 三星华为都有折叠屏手机了,苹果终于不甘落后,开始研发折叠屏iPhone!
- 关闭windows系统ssh连接linux终端发出提示音
- OPPO手机路迷5G
- 山东大学软件工程应用与实践——Pig代码综述
热门文章
- 交换机入门小知识2(MAC地址、交换机如何处理数据帧)
- 深度学习热点|超直观无公式图解Contrastive Predictive Coding从脸盲说起
- java cutline_利用JFreeChart生成饼形图
- 问题解决:ERROR: Cannot uninstall 'llvmlite'.
- 公司 邮件 翻译 培训 长难句 13
- reactive、ref、toRef、toRefs
- 【微信支付付款至零钱】
- Vivado使用技巧(12):设置DCI与内部参考电压
- 树莓派 cpolar免费vip穿透局域网异地连接(ssh web均可)
- VS2013使用教程总结(3)---修改VA的注释