如何在直播中解决黑屏、花屏、闪屏问题 | 直播疑难杂症排查

 

本文是 《直播疑难杂症排查》系列的第七篇文章,咱们来重点看看直播中常见的各类黑屏、花屏、闪屏问题。网络

首先咱们要明白,黑屏、花屏、闪屏等问题,多是推流端的问题,也多是播放器的问题,遇到这些现象,咱们要第一时间用别的播放器(如 VLC,ffplay)试试,若是都出现一样的问题,那么多半是流自己的问题了,反之,则极可能是播放器的问题。ide

 

播放黑屏

现象:画面是黑的,没有图像,可是有声音。编码

 

1.主播端摄像头权限问题3d

不管 Android 仍是 iOS,App 使用摄像头都是须要申请受权的,特别是 Android 6.0 之后,若是 App 层面不作专门的处理的话,极可能出现摄像头权限被禁用的状况。日志

若是 App 没有获取到摄像头权限,视频就没法采集成功,从而致使推出来的流只有音频数据。视频

解决方案:App 层面确定要当心处理权限问题,检测到未获取相应权限则禁止开播,或者反复提示主播授予权限。另外,能够询问出现问题的主播是否有摄像头预览画面,若是 App 没有得到权限的话,是没有预览画面的。队列

 

2.主播端编码失败图片

视频数据采集到后,下一步就是通过编码器,因为参数配置或者某些机型的硬编兼容性问题,极可能数据送入编码器后,编码失败,并没有输出,从而致使没有视频数据送入到推流模块。ip

解决方案:通常推流 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.推流端的缘由

推流端产生闪屏的流,每每发生在有画面合成的代码模块,好比:叠加水印、摄像头/图片切换推流、连麦合流等等。

画面的合成,必定要铭记一点,任何状况下,都要避免出现,有合成/没有合成两种画面的交替。

 


推荐阅读:

相关文章
相关标签/搜索