项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明了是因为UI层的问题导致的,需要自己排查。涉及到该问题的链接:
通过ijkPlayer播放m3u8视频时快进不准确的解决方案
为什么Sample里面的进度条,往前拖动进度条后,还会往后退几秒
向前拖动,进度条会往回跳
https://github.com/Bilibili/ijkplayer/issues/313
bbcallen commented on Jul 8, 2015
UI部分seekbar的回调处理得不太合理,如果放手很快,最后一个位置不会被传给播放器,建议自行修改。
既然开发者都说了,那么就老实分析代码吧。因为项目中用到的MediaController
继承自Android系统的MediaController
,所以还得看看源码,分析得出系统中实现是将seek的listener监听器放在onProgressChanged
这个方法中,这也是为什么我们断断续续拖动的时候播放器也会播放,知道这点就够了,把onProgressChanged
中的mPlayer.seekTo((int) newposition);
放到onStopTrackingTouch
方法中。
执行顺序是:
onStartTrackingTouch(执行一次) —> onProgressChanged(拖动就会不停的执行) —> onStopTrackingTouch(停止后最后执行一次)
实现代码如下:
1 | public class CustomMediaController extends MediaController implements ICustomMediaController { |