博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题
阅读量:5173 次
发布时间:2019-06-13

本文共 3465 字,大约阅读时间需要 11 分钟。

项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明了是因为UI层的问题导致的,需要自己排查。涉及到该问题的链接:

  • 通过ijkPlayer播放m3u8视频时快进不准确的解决方案

  • 为什么Sample里面的进度条,往前拖动进度条后,还会往后退几秒

  • 向前拖动,进度条会往回跳

    bbcallen commented 

    UI部分seekbar的回调处理得不太合理,如果放手很快,最后一个位置不会被传给播放器,建议自行修改。

既然开发者都说了,那么就老实分析代码吧。因为项目中用到的MediaController继承自Android系统的MediaController,所以还得看看源码,分析得出系统中实现是将seek的listener监听器放在onProgressChanged这个方法中,这也是为什么我们断断续续拖动的时候播放器也会播放,知道这点就够了,把onProgressChanged中的mPlayer.seekTo((int) newposition);放到onStopTrackingTouch方法中。

执行顺序是:

onStartTrackingTouch(执行一次) —> onProgressChanged(拖动就会不停的执行) —> onStopTrackingTouch(停止后最后执行一次)

实现代码如下:

public class CustomMediaController extends MediaController implements ICustomMediaController {    // ....................代码省略.............................  // There are two scenarios that can trigger the seekbar listener to trigger:  //  // The first is the user using the touchpad to adjust the posititon of the  // seekbar's thumb. In this case onStartTrackingTouch is called followed by  // a number of onProgressChanged notifications, concluded by onStopTrackingTouch.  // We're setting the field "mDragging" to true for the duration of the dragging  // session to avoid jumps in the position in case of ongoing playback.  //  // The second scenario involves the user operating the scroll ball, in this  // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,  // we will simply apply the updated position without suspending regular updates.  private OnSeekBarChangeListener mSeekListener=new OnSeekBarChangeListener(){    long newposition;    public void onStartTrackingTouch(SeekBar bar){      show(3600000);      mDragging=true;      if(seekerBarDraggingListener!=null)        seekerBarDraggingListener.getCurrentDraggingstatus(mDragging);      // By removing these pending progress messages we make sure      // that a) we won't update the progress while the user adjusts      // the seekbar and b) once the user is done dragging the thumb      // we will post one of these messages to the queue again and      // this ensures that there will be exactly one message queued up.      mHandler.removeMessages(SHOW_PROGRESS);    }    public void onProgressChanged(SeekBar bar,int progress,boolean fromuser){      if(!fromuser){        // We're not interested in programmatically generated changes to        // the progress bar's position.        return;      }      long duration=mPlayer.getDuration();      newposition=(duration*progress)/1000L;      // 系统原来的实现是在progress改变的时候时刻都在进行videoplayer的seek      //这会导致seek m3u8切片文件的时候拖动seek时不准确,所以需要在拖动完成后才进行播放器的seekTo()      //                mPlayer.seekTo((int) newposition);      if(mCurrentTime!=null)        mCurrentTime.setText(stringForTime((int)newposition));    }    public void onStopTrackingTouch(SeekBar bar){      mDragging=false;      mPlayer.seekTo((int)newposition);      if(seekerBarDraggingListener!=null)        seekerBarDraggingListener.getCurrentDraggingstatus(mDragging);      setProgress();      updatePausePlay();      if(isntNeedStayShowAfterDrag){        show(sDefaultTimeout);        // Ensure that progress is properly updated in the future,        // the call to show() does not guarantee this because it is a        // no-op if we are already showing.        mHandler.sendEmptyMessage(SHOW_PROGRESS);      }    }  };  // ....................代码省略.............................}

转载于:https://www.cnblogs.com/raomengyang/p/6047456.html

你可能感兴趣的文章
(最短路)17bupt新生赛——F. ch追妹
查看>>
mysql5.6免安装版配置
查看>>
node.js express安装问题
查看>>
文本处理 - 测试一个对象是否是类字符串
查看>>
如何使用shell收集linux系统状态,并把结果发给远端服务器
查看>>
【转载】Xpath定位方法深入探讨及元素定位失败常见情况
查看>>
eclipse中如何远程java debug配置
查看>>
Tomcat7安装和配置以及优化
查看>>
Docker 架构(二)【转】
查看>>
jQuery Tips(5)----关于伪类选择符
查看>>
IDEA快捷建使用
查看>>
如何修改sql server 表中自增长ID列,因删除而不连续。可以使用临时表
查看>>
IE7,iE6,超链接禁用失效解决方法
查看>>
Context Menu控件
查看>>
UEditor使用说明
查看>>
使用Jmeter对API进行性能测试
查看>>
HTML与JSP页面的区别
查看>>
实验二 作业调度
查看>>
Lucene01
查看>>
MCS-51子程序库-1
查看>>