1 直播中为什么会呈现花屏、黑屏、闪屏?
-
主播没有打开摄像头权限,推流端没有做好权限校验处理。
-
收集Camera数据,就要开端编码,假如编码失利,没有推送数据,那就会黑屏。
-
拉流段遇到不支撑的视频格式,或许解析出来的数据反常,呈现解码失利,导致无法播映视频,呈现黑屏。
-
推流过程中由于网络问题不得不丢帧处理,此刻丢掉了参阅帧,导致后续拉流段解码的时分因为失去参阅帧解码出来的数据呈现花屏状况。假如需求丢帧,应该一次就丢掉整个GOP的数据,否则就可能呈现花屏现象。
-
播映器拉流的时分首帧不是要害帧,导致花屏,一定要判别首帧是要害帧才开端处理,否则没有要害整个GOP的数据解出来都有问题的。
-
推流端直播size发生变化,拉流端没有重置解码器,导致拉流端解出来的数据反常。
-
硬解码的兼容性问题,呈现编码器无法支撑格式,例如相机收集的是NV21,但是编码器只能支撑I420,那推出去的视频就会呈现色差。
2 音视频软件功能优化
稳定性优化
-
内存处理:
-
编码过程中养成杰出的习惯,malloc和free对应,new和delete对应。开释内存之后,一定要将对应的指针置空,否则会呈现野指针问题。
-
内存检测东西:asan和memory leaker,功能做完了,记得用这个东西跑一下。
-
避免内存颤动,频频的内存颤动暴露了程序中内存恳求的不合理,也会拖慢整体的运转功率。
-
-
ANR处理:
-
pthread_join卡死问题,音视频中经常呈现此类问题,开释资源时,子线程卡死了,pthread_join一直卡在那儿,导致主线程ANR。线程规划的时分要特别注意。
-
主线程一定要谨慎操作,不能做网络恳求、IO操作(一些IO操作比较荫蔽,例如解析视频)等。
-
线程优化:
-
线程规划,是否一定需求这个线程,能不添加就不添加,添加一个线程要恳求一定的资源,并且还会有多线程的问题。
-
C++ Handler Message音讯机制。
-
多线程安全。
-
pthread_join卡死问题,上面提到过。
功耗优化
-
数据量太大,音视频处理的视频帧现在一般都1080P的,相对比较大。
-
操作比较多,YUV2RGB的转化比较频频,假如是GPU的处理还好一点,CPU计算转化则很耗资源。
-
软编码和软解码耗费大量的CPU资源。
-
音视频处理中会使用特效、美颜、算法等处理,这些都比较耗资源。
-
音视频中大量的memory copy操作,也会耗费资源。
3 音视频技术中的卡顿优化
咱们还是以直播为例,拉流端有时分会呈现卡顿,咱们需求从全链路的角度剖析这些卡顿。
-
音视频不同步:
-
推流端音视频同步没做好,那这种卡顿很风险,会一直持续下去的,并且无法纠正。RTMP推流的时分需求好好剖析时刻戳的问题,A-V不能相差超越100ms
-
推流端在弱网丢帧的状况下也要做好音视频同步,一般要丢帧整个GOP,这时分也要相应丢掉对应时刻点的音频数据。
-
拉流端缓冲规划要做好,解码行列中数据不可导致音视频解码时同步总是对不上。
-
点播状况下有些视频很怪:视频中封装的音频和视频相差比较大,有时分会相差好几秒,这就是这个视频源有问题了。
-
-
弱网环境:
-
弱网状况下,推流端没有适配好的丢帧战略或许说适配了丢帧战略,但是在弱网状况下还是推流较高清的视频,在拉流端播映会呈现卡顿。
-
拉流端没有缓存一段数据,一遇到网络颤动,会呈现卡顿。
-
-
处理耗时:
-
推流端处理纹路时比较耗时,加了滤镜、美颜、其他算法处理导致收集比较慢,会呈现掉帧卡顿。
-
CDN分发不可,恳求负载过大,导致CDN分发呈现反常。
-
4 直播要害技术指标
-
推流平均码率
-
丢帧率
-
主动切换码率频率