视频播放器播放某些视频拖动的 时候卡顿
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
视频播放器播放1080P的视频,在拖动的时候卡顿,最长加载需要2s左右。
[SOLUTION]
一、Mainlog分析
1.一共有15次seekto的动作,正常情况大致时间为500ms左右,但是最后一次seek时间比较长,大致有1375ms
01-01 00:02:47.844 161 3286 D MediaPlayerService: [1] seekTo(51898)
//7表示MEDIA_PUASED
01-01 00:02:47.852 161 3286 D MediaPlayerService: [1] notify (0xb7eaeae0,
7_, 0, 0, 0)
01-01 00:02:47.853 2740 2740 D MediaPlayer: handleMessage msg(_7, 0, 0)
//6表示MEDIA_STARTED
01-01 00:02:49.116 161 3415 D MediaPlayerService: [1] notify (0xb7eaeae0,
6_, 0, 0, 0)_
01-01 00:02:49.121 2740 2740 D MediaPlayer: handleMessage msg(6, 0, 0)
//4表示MEDIA_SEEK_COMPLETE
01-01 00:02:49.219 161 3415 D MediaPlayerService: [1] notify (0xb7eaeae0,
4_, 0, 0, 0)
2. 比较了此次seek和其他seek动作,其他并无异常,只是seek的过程中264 nal dec的次数很多,通常是50次,但是这次将近250次,且这部分耗时960ms;
//NAL 5表示AVC_NALTYPE_IDR
01-01 00:02:48.079 161 3421 D MPEG4Extractor: seekTimeUs=_51898000,
seekMode=_3
01-01 00:02:48.0861614321 E MPEG4Extractor: targetSampleTimeUs=51885218
01-01 00:02:48.121 161 3417 D mtkOmxVdec: 264 DEC, 49849849_, 0x10 15046
(0xB7EC6CF8, 0xB7EC8A90), NAL 5 (0 ms, 0 ms), 0
...
//NAL 1表示AVC_NALTYPE_SLICE
01-01 00:02:49.081 161 3417 D MtkOmxVdec: 264 DEC, 51885218_, 0x10 5053
(0xB7EC74B8, 0xB7EC90F8), NAL 1 (0 ms, 0 ms), 0
3.seek原理
APP通过进度条的计算会带下来一个时间点,但是该时间点不一定对应对I帧。若是非I帧,且与I帧间隔比较远,我们需要解码的帧就会比较多,耗时就比较长。
从log来看确实是从nal type 5(AVC_NALTYPE_IDR)开始解码,中间nal type一直为1(AVC_NALTYPE_SLICE);虽然当前seek的时间点是51885218,但是会从49849849开始解码
二、用工具查看视频信息
vidoe track的mdhd box里timescale=2997
stts box里entry_count=1, entries[0].sample_count=5805,
entries[0].sample_delta=100
计算51.898s对应的sample no为51.898*2997/1001555
再查看stss关键帧表,找前一个关键帧,所以需要开始解码的sample numbler是1494
entries[63].sample_number = 1456
entries[64].sample_number = 1494
entries[65].sample_number = 1556
entries[66].sample_number = 1619
综上所述,该问题为正常现象。
视频播放器播放1080P的视频,在拖动的时候卡顿,最长加载需要2s左右。
[SOLUTION]
一、Mainlog分析
1.一共有15次seekto的动作,正常情况大致时间为500ms左右,但是最后一次seek时间比较长,大致有1375ms
01-01 00:02:47.844 161 3286 D MediaPlayerService: [1] seekTo(51898)
//7表示MEDIA_PUASED
01-01 00:02:47.852 161 3286 D MediaPlayerService: [1] notify (0xb7eaeae0,
7_, 0, 0, 0)
01-01 00:02:47.853 2740 2740 D MediaPlayer: handleMessage msg(_7, 0, 0)
//6表示MEDIA_STARTED
01-01 00:02:49.116 161 3415 D MediaPlayerService: [1] notify (0xb7eaeae0,
6_, 0, 0, 0)_
01-01 00:02:49.121 2740 2740 D MediaPlayer: handleMessage msg(6, 0, 0)
//4表示MEDIA_SEEK_COMPLETE
01-01 00:02:49.219 161 3415 D MediaPlayerService: [1] notify (0xb7eaeae0,
4_, 0, 0, 0)
2. 比较了此次seek和其他seek动作,其他并无异常,只是seek的过程中264 nal dec的次数很多,通常是50次,但是这次将近250次,且这部分耗时960ms;
//NAL 5表示AVC_NALTYPE_IDR
01-01 00:02:48.079 161 3421 D MPEG4Extractor: seekTimeUs=_51898000,
seekMode=_3
01-01 00:02:48.0861614321 E MPEG4Extractor: targetSampleTimeUs=51885218
01-01 00:02:48.121 161 3417 D mtkOmxVdec: 264 DEC, 49849849_, 0x10 15046
(0xB7EC6CF8, 0xB7EC8A90), NAL 5 (0 ms, 0 ms), 0
...
//NAL 1表示AVC_NALTYPE_SLICE
01-01 00:02:49.081 161 3417 D MtkOmxVdec: 264 DEC, 51885218_, 0x10 5053
(0xB7EC74B8, 0xB7EC90F8), NAL 1 (0 ms, 0 ms), 0
3.seek原理
APP通过进度条的计算会带下来一个时间点,但是该时间点不一定对应对I帧。若是非I帧,且与I帧间隔比较远,我们需要解码的帧就会比较多,耗时就比较长。
从log来看确实是从nal type 5(AVC_NALTYPE_IDR)开始解码,中间nal type一直为1(AVC_NALTYPE_SLICE);虽然当前seek的时间点是51885218,但是会从49849849开始解码
二、用工具查看视频信息
vidoe track的mdhd box里timescale=2997
stts box里entry_count=1, entries[0].sample_count=5805,
entries[0].sample_delta=100
计算51.898s对应的sample no为51.898*2997/1001555
再查看stss关键帧表,找前一个关键帧,所以需要开始解码的sample numbler是1494
entries[63].sample_number = 1456
entries[64].sample_number = 1494
entries[65].sample_number = 1556
entries[66].sample_number = 1619
综上所述,该问题为正常现象。
学习学习