「黑屏、花屏、闪屏」经常出现在直播应用中,除了网络问题,在直播过程中的黑屏、花屏、闪屏却有很多技术原因,这篇文章将全方位为你解决直播中的「黑屏、花屏、闪屏」问题。
继《直播技术详解》系列文章之后,我们推出了这个新的系列《直播疑难杂症排查》,把解决直播问题的经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,希望能够帮助到直播领域的开发者们。
本系列会涵盖的内容包括但不限于如下一些主题: - 播放失败 - 直播卡顿 - 首开慢 - 延时高 - 音画不同步 - 马赛克严重 - 播放黑屏、花屏、绿屏 - 播放杂音、噪音、回声 - 点播拖动不准 - 直播发热问题 - 其他问题(待续)
首先我们要明白,黑屏、花屏、闪屏等问题,可能是推流端的问题,也可能是播放器的问题,遇到这些现象,我们要第一时间用别的播放器(如 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 帧,也会导致解码失败。
对于丢失了参考帧而导致的解码失败,一般就会出现花屏的现象,花屏的严重程度依赖于丢失的参考帧对即将解码的帧的重要程度。
那么,什么情况下会丢失参考帧呢 ?
首先,推流/播放的代码层面,需要注意,不要丢弃编码后、解码前的视频帧数据,不过实际场景中,遇到下面的情况,难免还是会产生丢帧: 网络不好,编码后的数据发不出去
系统低内存,队列里面无法承受