「黑屏、花屏、闪屏」经常出现在直播应用中,除了网络问题,在直播过程中的黑屏、花屏、闪屏却有很多技术原因,这篇文章将全方位为你解决直播中的「黑屏、花屏、闪屏」问题。

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


本系列会涵盖的内容包括但不限于如下一些主题:
- 播放失败
- 直播卡顿
- 首开慢
- 延时高
- 音画不同步
- 马赛克严重
- 播放黑屏、花屏、绿屏
- 播放杂音、噪音、回声
- 点播拖动不准
- 直播发热问题
- 其他问题(待续)

首先我们要明白,黑屏、花屏、闪屏等问题,可能是推流端的问题,也可能是播放器的问题,遇到这些现象,我们要第一时间用别的播放器(如 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 端尽可能避免出现这种使用姿势,修改播放器的代码,对这种码流进行兼容处理。

播放花屏/绿屏

现象:播放画面出现图像紊乱,大面积的异常颜色的方块图,或者绿屏现象

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 分钟搞明白如何在直播中解决黑屏、花屏、闪屏问题相关推荐

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

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

  2. 如何解决直播中黑屏、花屏、闪屏问题?10 分钟搞明白

    播放失败 直播卡顿 首开慢 延时高 音画不同步 马赛克严重 播放黑屏.花屏.绿屏 播放杂音.噪音.回声 点播拖动不准 直播发热问题 其他问题(待续) 首先我们要明白,黑屏.花屏.闪屏等问题,可能是推流 ...

  3. 10分钟搞定miniconda-python环境安装

    windows配置python环境 每次到一个新电脑就要安装环境,很多包安装起来很麻烦,下面对安装地址和常规使用包做了总结,一键安装所有包不用再一个一个找了!所有问题10分钟搞定! 1. 安装Mini ...

  4. 视频教程-10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码)-微信开发

    10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码) 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. ...

  5. 风控必备的评分卡模型,TempoAI 10分钟搞定

    8月20日,央行发布了<2020年第二季度支付体系运行总体情况>,数据显示,截至第二季度末,信用卡逾期半年未偿信贷总额838.84亿元,占信用卡应偿信贷余额的1.17%.与一季度相比,信用 ...

  6. 10分钟搞定win11安卓子系统

    10分钟搞定win11安卓子系统 Android子系统的要求 一.安装 Windows 虚拟化支持 二.Win11 正式版安装安卓子系统方法教程 (离线包安装) 三.在Win11 安卓子系统安装 AP ...

  7. w ndows 10画图,网友“羞辱”Windows 10界面设计:用画图 10分钟搞定!

    原标题:网友"羞辱"Windows 10界面设计:用画图 10分钟搞定! Windows 10是个好系统,但是UI界面设计一直有不小的争议.微软试图全面扁平化,但很多时候仿佛只是为 ...

  8. 三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 转载原文,并注明出处!虽无多少技术含量,毕竟是作者心血原创,希望理解. 转自 http://blog.csdn.net ...

  9. mysql降低数据库版本_三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQ...

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 前思后想仍觉得实战数据库版本的降迁一文中的方式不仅老土而且低效,故有了下文三步搞定数据库从MSSQL2008R2 高版 ...

最新文章

  1. python中的path是什么_python中的os.path.splitext是干什么用的
  2. 1.25亿用户以后,Netflix总结的系统高可用经验
  3. 大一萌新看过来,“这样”学C++,让你不再迷茫!
  4. SQL Server到底需要使用哪些端口
  5. 谷歌浏览器安装插件的方法步骤
  6. UART通信协议知识入门
  7. Android recyclerview上拉加载更多
  8. Go语言交叉编译二进制文件
  9. 数据库系统之物理设计
  10. Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.dataformat.yaml.YAMLFactory的解决方法
  11. SAP 设置周期性的后台程序,SM36,图解操作 (转)
  12. 橄榄山BIM大学论坛正式启用,有Revit二次开发专版。可去那里问问题 http://bbs.glsbim.com
  13. element ui中穿梭框等列表文字显示过长隐藏问题处理
  14. VMware虚拟机 linux NAT网络模式下 网关地址默认为192.168.1.2
  15. Yunzai-Bot v3—Linux服务器搭建教程
  16. 车牌识别系统连接不到后台服务器,车牌识别系统常见故障及解决方法
  17. 群辉服务器更新系统教程,男人的生产力工具 篇二百四十六:新手玩转群晖NAS:一步一步教你更新群晖DSM系统...
  18. linux中如何实现动态域名解析
  19. spring-data-redis连接池
  20. 接入腾讯联盟广告Banner最简单的

热门文章

  1. 如何在手机端从多个Excel文件多个Sheet中搜索某一内容,多个excel文件批量查找
  2. C#找到最小的整数X,同时满足:X是2019的整倍数,X的每一位数字是奇数
  3. 小米手机无法读取图片路径的问题
  4. not Chrome binary file---没有谷歌二进制文件 Windows10出现的问题
  5. 华为系创业成功少 华为创业十大系
  6. 天若 ocr 识别失败,出现***该区域未发现文本***提示
  7. ACM/ICPC 比赛生涯总结+经验分享
  8. 人工智能简史和未来发展趋势
  9. 震惊!电销机器人对传统销售的冲击这么大
  10. 走近CSDN博客Markdown编辑器