android 播放网络视频:拖动进度条,实现缓冲到拖动位置才开始播放的问题

移动开发 码拜 6年前 (2015-05-10) 655次浏览 0个评论

android 播放网络视频:拖动进度条之后, 先暂停当前视频, 等缓冲完毕数据之后再播放视频怎么实现
相关:
(1)因为现在的情况是还没缓冲到我拖动的位置,就开始播放视频了,这样出现有1到2秒左右的卡顿,一个师兄建议我
缓冲到拖动的位置完毕之后再开始播放
(2)准备使用mediaPlayer回调函数中实现的public boolean onInfo(MediaPlayer mp, int what, int extra, int viewId)
的常量      MEDIA_INFO_BUFFERING_START,      MEDIA_INFO_BUFFERING_END
来实现,但是问题是,当拖动进度条的时候,MediaPlayer的seekTo执行完毕之后,videoActivity才接受到这两个常量的消息提醒。
而seekTo执行之后,视频就已经跳到还没缓冲完毕的位置上,导致卡顿。

总结一下:怎么做才能在使得视频seekTo到 已经缓冲完毕的视频上面?

5分
setOnPreparedListener设置后,拖动后会等缓冲数据准备好再播放。
你从网上get到的视频长度,与视频的总长度,还有当前seekBar的位置,seekBar与视频总长度之间有个比率,利用这些值可以总结出一个思路。比如说:当前拖动到40%的位置,那么视频总长度乘以(1 – 40%)就应该是当前视频播放的位置,那么,你现在就可以判断下get到的视频长度是否到达这个值,如果到了,那么可以播放,没到,那么就缓冲。

思路:get到的视频长度,每隔5秒,用临时文件存储一下,然后在你seekBar的Activity获取出来,然后,用seekBar的与视频总长度的比率乘以视频总长度,然后比较这2个值,如果,get到的值小于这个值,那么,就缓冲一下;反之,则可以开始播放。(小建议:最好把这个比率乘以总长度的值尽量大一点,这样做的原因是,怎么说呢,我们看视频的时候,有见过缓冲的灰色进度条吧,大概就是这个意思了,多缓冲一下,可以使得播放更加流畅,呵呵。)

个人觉得可行,之前我用MediaPlayer做视频的时候,没碰到过卡,不过,我只是测试了下同事做的网站上的视频,呵呵,可能是单用户访问的原因吧。

45分
昨晚看了一部电影,睡觉前,突然有了一个想法。
用FreamLayout把progressBar 和seekBar 放在一个位置上,progressBar和seekBar的最大值都设为当前视频总长度,开启线程加载进度条,progressBar和seekBar的颜色调下,progressBar颜色浅一点,就好像看视频时的那个灰色进度条一样,get到的数据用线程加载到进度条上,这样就可以清楚的看到当前缓冲到的地方;如果用户非要拖动seekBar到没有缓冲好的地方,那么开启一个线程加载圆形进度条并暂停播放,然后,取出progressBar的值与seekBar所在的位置的值比较,就可以知道该缓冲还是该播放了。大致意思就是这样,希望我的描述你的理解,呵呵。
引用 3 楼 u012137924 的回复:

昨晚看了一部电影,睡觉前,突然有了一个想法。
用FreamLayout把progressBar 和seekBar 放在一个位置上,progressBar和seekBar的最大值都设为当前视频总长度,开启线程加载进度条,progressBar和seekBar的颜色调下,progressBar颜色浅一点,就好像看视频时的那个灰色进度条一样,get到的数据用线程加载到进度条上,这样就可以清楚的看到当前缓冲到的地方;如果用户非要拖动seekBar到没有缓冲好的地方,那么开启一个线程加载圆形进度条并暂停播放,然后,取出progressBar的值与seekBar所在的位置的值比较,就可以知道该缓冲还是该播放了。大致意思就是这样,希望我的描述你的理解,呵呵。

谢谢你的解答

谢谢你的采纳,呵呵,补充下,最近发现,SeekBar也有secondBar这个属性,看了API才发现,他是ProgressBar的孙子类,汗,之前一直没注意,惭愧啊。secondBar应该就是用来显示缓冲的那条灰色条了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android 播放网络视频:拖动进度条,实现缓冲到拖动位置才开始播放的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!