播放器加载一个网络url,首先要进行网络请求,网络如何优化,涉及到网络优化的方方面面。 网络拉取回来数据之后,识别一下当前视频的具体封装格式,这个可以正式流式视频,也可以是普通视频,优化的手段有点不同。 识别到具体的封装格式,按照封装格式的要求,开始解析封装格式,解析其中的音频流、视频流、字幕流等等。 音频流要解码成音频原始数据,视频流要解码成视频原始数据。 解码过程中注意音视频同步。 音频播放,同时视频开始渲染。
播放失败率高 播放首帧慢 播放卡顿 播放器占用CPU、内存过高
怎么监控这些问题 怎么解决这类问题
这两个问题是有有递进关系的,“怎么监控这些问题”就是为了更好地“解决这类问题”。
1、网络加载监控 播放视频首要的是网络加载,网络请求是一个复杂的过程,全链路的点太多,将全链路的所有点收集起来,可以在播放器中加上网络的全链路监控:
这样我们对网络的整体加载情况有了全面的把握,发生网络加载问题,也知道是哪个点出现了问题,分析解决问题有了更加全的数据。 2、播放器全链路监控 开篇就分析了播放器的完整流程,其实开发者也非常需要当前播放器的运行状态: 播放器的工作状态也可以拆解一下:
播放器发生状态异常,开发者可以明确获知播放器当前所处的状态。 每个状态都可能发生异常,发生异常都有具体的原因。利用播放器状态、播放器出错情况构建一个较为完善的播放监控体系。 3、播放器流畅度监控 播放卡顿,就是播放过程中发生loading,UI直接显示转圈,这对用户体验的损害是巨大的,用户在不断的吐槽中默默地卸载了我们的app。卡顿的主要原因是网络状况不好,很小的一部分原因是源的问题。
卡顿的次数 卡顿的时长 卡顿时的网速
单次播放平均卡顿次数和卡顿时间是我们衡量播放流畅度的重要指标。 如果是源的问题,例如出现播放视频的时候,进度条在走,但是画面不走,就是视频解码出现问题,但是又没有出错,只是解码出的数据有问题。 解码出的数据有问题,有两种情况:原始数据就存在问题,这种情况下基本无法优化;另一种情况下是解码线程异常。
MediaCodec发生异常 解码线程异常错误
监控发生问题时系统codec的具体状态,然后上报,便于分析问题。
播放失败的原因很多,使用播放器播放视频,最终都会在Player.onError回调中通知开发者播放失败了,最多返回一个错误码,对应一个播放错误。 总结而言,播放错误主要分为下面几类:
网络加载错误:网络请求发生问题,可能是网络请求的任何一个阶段。 视频格式识别错误:不支持当前的格式,或者当前格式识别出错。 解码出错:不支持当前视频、音频解码导致的出错,或者系统codec异常导致的问题。 文件的IO异常:读取缓存文件发生问题。
网络加载错误一般要视情况而定,网络超时要做好超时重试机制。 视频格式支持使用ffmpeg能解决基本上所有的视频格式的识别和处理工作。 MediaCodec解码受到手机硬件的制约,解码有时候会出错,出错可以切换到软解码。