我有一个可以从内存中播放的VideoView。我的视频正在播放VideoView日志MediaPlayer: error (1, -1004)
。我有一个onErrorListener附加到VideoView,我想在那里管理这个错误。我的目标是获取最后一个位置(来自getCurrentPosition()
)并使用seekTo(int position)
从该位置再次启动我的玩家。我的视频文件有效(通过在其他玩家上播放进行验证)。我现在的问题是从VideoView获取最后一个有效位置。从onError调用getCurrentPosition()
(MediaPlayer mp,int what,int extra)在我执行mp.getCurrentPosition / mVideoView.getCurrentPosition()
时返回0(非常正确)。如何在播放时跟踪播放器的当前位置?
这是我的代码:
mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Log.v("error", "media error unknown");
mediaErrorExtra(mp, extra, path);
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Log.v("error", "media error server died");
mediaErrorExtra(mp, extra, path);
break;
}
return true;
}
});
private void mediaErrorExtra(MediaPlayer mp, int extra, String path){
switch(extra){
case MediaPlayer.MEDIA_ERROR_IO:
if(!mp.isPlaying()){
Integer currentposition = mVideoView.getCurrentPosition();
if(currentposition != null){
Log.v("currentpos",Integer.toString(currentposition));
}
mVideoView.setVideoPath(path);
mVideoView.start();
//mVideoView.seekTo(currentposition);
}
break;
case MediaPlayer.MEDIA_ERROR_MALFORMED:
Log.v("error extra","media error malformed");
break;
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
Log.v("error extra","media error unsupported");
break;
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
Log.v("error extra","media error timed out");
break;
}
}
或者是否有任何听众在播放时提供播放器的当前位置?我可以使用while(isPlaying()){int currentposition = mVideoView.getCurrrentPosition()}
,但我认为这是处理事情的坏方法。任何建议都将非常感谢。提前谢谢。
答案 0 :(得分:1)
我展示了我用过的处理程序......
$.SetInLocalStorageVideoTime("blahblah").Interval();
你应该使用处理程序..
答案 1 :(得分:0)
你使用while
的东西走在正确的轨道上,但它需要更多的精炼,因为while可能会完全阻止UI。
所以你应该做的是使用一个Handler
,它会在{1}}位置每1秒触发一次检查,我认为1秒是非常合理的。
我已经使用这种方法为MediaPlayer实现自定义MediaPlayer
,并且它非常完美。
答案 2 :(得分:0)
回答我的问题:
ScheduledExecutorService
帮助解决了这个问题:
以下是我在播放器播放时获取当前位置的方式:
ScheduledExecutorService mScheduledExecutorService;
int mCurrentposition = 0;
Runnable UpdateCurrentPosition = new Runnable(){
@Override
public void run() {
mCurrentposition = mVideoView.getCurrentPosition();
}
};
@Override
protected void onCreate(){
...
mScheduledExecutorService = new ScheduledExecutor(1);
mScheduledExecutorService.scheduleWithFixedDelay(new Runnable(){
@Override
public void run() {
mVideoView.post(UpdateCurrentPosition);
}
},3000,1000,TimeUnit.MILLISECONDS);
}
答案 3 :(得分:0)
private int time = 0;
private ScheduledExecutorService mScheduledExecutorService;
Runnable getPositionVideo = () -> {
time = binding.videoView.getCurrentPosition();
};
binding.videoView.setOnPreparedListener(mediaPlayer -> {
binding.videoView.seekTo(position);
binding.videoView.start();
mScheduledExecutorService = new ScheduledThreadPoolExecutor(1);
mScheduledExecutorService.scheduleWithFixedDelay(() -> {
runOnUiThread(getPositionVideo);
MediaControllerExitFullScreen.init(video_url, time);
}, 1000, 1000, TimeUnit.MILLISECONDS);