您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
安卓开发-如何解决seekto超级速度响应下的崩溃问题
发布时间:2021-07-10 11:17:07编辑:雪饮阅读()
之前笔者开发对于视频播放来说都是用的比较原生的surefaceview来实现,这样实现逻辑代码其实挺多的,后来发现安卓中还可以用videoview,这样可以省下不少开发代码。
但是由于刚刚接触videoview,用到一个需求就是需要视频停止操作被执行后获取视频第一帧(初始化状态)时的图片显示在videoview中,但是实际上没有发现相关api,那么我只能另辟新径。我在停止逻辑执行前先seekto到视频结束位置,然后在执行停止,因为视频默认到了结束位置时候就会自动回到初始状态了。可能是由于seekto和停止之间的代码即
seekTo与stopPlayback之间执行太快,没有等到seekto执行结束,就已经stopPlayback了。
所以我要的效果没有出来,那么我所幸在这两个操作之间加点延迟,虽然问题解决了,但是发现当点击过快时候(播放、停止、暂停等按钮来回高速点击)可能由于逻辑错综复杂,出现了一些问题,最后发现有时候seekto的时候操作句柄还没有准备好。也可能是上一个seekto没有执行完成了,因为为了不影响用户等待时间(体验),这个延迟基本都是在毫秒级别的,那么用户操作过快时候,seekto就有可能出现这种情况。
那么好吧,除非seekto还有重载的支持seekto成功之后回调的方法,查了一下没有这样的重载,但是好在seekto的确有回调,只是不在seekto本身,而是在videoview上。那么具体实现的关键代码如:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoDuration=videoView.getDuration();
seekbar_linearLayout.setVisibility(View.VISIBLE);
seekbar.setMax(videoDuration);
String t1_time= videoPlayProcessFormatDateTime(0);
seekbar_linearLayout_t1.setText(t1_time);
String t2_time= videoPlayProcessFormatDateTime(videoDuration);
seekbar_linearLayout_t2.setText(t2_time);
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// txt_cur.setText("当前进度值:" + progress + " / 100 ");
}
//进度条拖拽开始
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Toast.makeText(mContext, "触碰SeekBar", Toast.LENGTH_SHORT).show();
}
//进度跳拖拽结束
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int Position= seekbar.getProgress();
if(videoView!=null){
videoView.seekTo(Position);
String stopTime= videoPlayProcessFormatDateTime(Position);
seekbar_linearLayout_t1.setText(stopTime);
}
}
});
//设置 MediaPlayer 的 OnSeekComplete 监听
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
// seekTo 方法完成时的回调
if(is_stop){
videoView.stopPlayback();
bt_stop.setVisibility(View.GONE);
bt_pause.setVisibility(View.GONE);
bt_play.setVisibility(View.VISIBLE);
seekbar_linearLayout.setVisibility(View.GONE);
}
}
});
}
});
关键字词:seekto,seekto回调
相关文章
-
无相关信息