视频加载关键Trace点如下:
Trace关键字 | 描述 | 泳道/线程 |
|---|---|---|
H:DispatchTouchEvent xxx type=1 | 应用收到手指离开屏幕的事件 | 应用主进程 |
H:Create[组件名][self:组件id] | 组件创建 | 应用主进程 |
H:PlayerServer::PrepareAsync | 系统播放器服务准备播放 | media_service进程的H:PlayerServer::PrepareAsync泳道 |
H:PlayerServer::Play | 系统播放器服务启动播放 | media_service进程的H:PlayerServer::Play泳道 |
H:HiPlayerImpl::PrepareAsync | 播放器引擎实例初始化,准备播放。与H:PlayerServer::PrepareAsync对应,分析H:PlayerServer::PrepareAsync具体耗时情况需要分析该Trace关键字,如下图所示 | media_service进程的PlayerEngine线程 |
H:HiPlayerImpl::Play | 播放器引擎实例启动播放。与H:PlayerServer::Play对应,分析H:PlayerServer::Play具体耗时情况需要分析该Trace关键字,如下图所示 | media_service进程的PlayerEngine线程 |
H:HttpRequest | http请求 | 应用进程的H:HttpRequest泳道 |
以某应用视频加载时间长问题为例,定位过程如下:
应用收到手指离开屏幕事件到Video组件创建 | Video组件创建到播放器准备 | 播放器准备耗时 | 播放器播放耗时 |
|---|---|---|---|
10s | 41ms | 314ms | 25ms |

查看上图中应用收到手指离开屏幕事件到Video组件创建阶段,应用主线程并无长时间Running的情况,在Video组件创建前可以看到状态变量有刷新,怀疑应用刷新该状态变量后会触发Video组件创建,而状态变量刷新可能与http请求有关。

排查应用H:HttpRequest泳道信息发现应用有进行http请求,耗时接近10s,由此可知应用在加载视频前会进行http请求,从服务器获取数据后刷新组件的状态变量,创建Video组件开始播放视频。

搜索应用包名/NETSTACK日志关键字,查看http请求时的相关耗时参数,发现此处http请求耗时集中在firstRecv部分,应用服务器响应应用请求时,处理耗时较多。
04-22 21:36:54.839 22080 22716 I C015B0/com.example.myapplication/NETSTACK: [http_exec.cpp:418] taskid=-2147483621, size:40791, dns:0.100, connect:0.000, tls:0.000, firstSend:0.230, firstRecv:9672.959, total:9965.226, redirect:0.000, errCode:0, RespCode:200, httpVer:3, method:GET, osErr:0
应用收到手指离开屏幕事件到Video组件创建 | Video组件创建到播放器准备 | 播放器准备耗时 | 播放器播放耗时 |
|---|---|---|---|
394ms | 18.1ms | 12.4s | 44.4ms |

在日志中搜索BUFFERING_START PAUSE|BUFFERING_END PLAYING|HTTP Buffer is enough|bitrate =找到视频缓冲的起始点、结束点、起播水线、数据下载速度和视频码率,如下图中看到视频缓冲的时间为11.415s(BUFFERING_START PAUSE和BUFFERING_END PLAYING时间间隔),起播水线为5773077字节,下载速度为4209738bit/s,视频码率为9236923bps。
07-14 14:15:02.080 1707 3269 I C02B32/av_codec_service/HCODEC: [44][dec.avc][Initialized][Configure 104] bitrate = 9236923 | codec_config, bufferSize = 52 | codec_mime = video/avc | frame_rate = 30.000000 | height = 1080 | language = und | rotation_angle = 0 | track_index = 0 | track_start_time = 0 | track_type = 1 | video_delay = 1 | video_encoder_enable_surface_input_call ... 07-14 14:15:02.097 1436 24011 I C02B22/media_service/HiPlayer: #2180 BUFFERING_START PAUSE 07-14 14:15:13.512 1436 24017 I C02B23/media_service/HiStreamer: (HandleBuffering(), 289): HTTP Buffer is enough, bufferSize:5773623 waterLineAbove: 5773077 avgDownloadSpeed: 4209738.819320 07-14 14:15:13.512 1436 24011 I C02B22/media_service/HiPlayer: #2171 BUFFERING_END PLAYING
由于视频码率大于下载速率,起播水线取值为5*9236923/8=5773076.875字节,与日志中看见的一致,由于视频码率较大,超过当前网络下载速率,视频缓冲到起播水线需要时间,导致视频加载慢。
视频加载慢的原因有: