Android MediaPlayer 意外停止播放(未完成)
Android MediaPlayer unexpectedly stops playback (without being finalized)
我只是偶然发现了这个不太明显的解决方案,我认为如果我分享我的发现可能会对某些人有所帮助。
有很多类似的问题,但他们没有帮助我解决我的问题。 (不同)
我有一个 activity 可以播放有声视频,然后显示图像 3 秒,然后显示动画地图视图 10 秒,然后播放另一个视频。
- 视频 1(~60 秒)
- 图像(~3 秒)
- 动画地图视图(~10 秒)
- 视频 2(~30 秒)
在第一个视频播放完毕后尝试播放音频时出现。
音频在地图视图期间播放良好,然后停止。
我尝试了各种场景,但音乐总是在发生变化时停止,尽管某些组合有效(例如,没有地图和视频 2(只是黑屏))。
我确实仔细查看了所有日志,但没有发现任何有用的信息。
问题是不是媒体播放器在完成之前正在 gc 或以某种方式完成。
private static MediaPlayer mediaplayer;
并在 OnCreate 中:
mediaplayer = new MediaPlayer();
AudioFocusRequest.Builder mp;
mediaplayer.setAudioAttributes(
new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
try {
mediaplayer.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.audio));
} catch (IOException e) {
e.printStackTrace();
Log.e("audio_management","error trying to set data source for audio");
}
try {
mediaplayer.prepare();
} catch (IOException e) {
e.printStackTrace();
Log.e("audio_management","error preparing");
}
这是我如何播放视频的示例
z.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
playPart2();
}
});
}
}, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);
这是 playPart2() 函数:
public void playPart2() {
ImageView imgbg = findViewById(R.id.imageView);
ImageView agO = findViewById(R.id.agent1);
ImageView agTw = findViewById(R.id.agent2);
ImageView agTh = findViewById(R.id.agent3);
ImageView agFo = findViewById(R.id.agent4);
ImageView agFi = findViewById(R.id.agent5);
ImageView agSi = findViewById(R.id.agent6);
VideoView player = findViewById(R.id.videoView);
MapView mMap = findViewById(R.id.map);
mMap.setVisibility(View.INVISIBLE);
imgbg.setVisibility(View.INVISIBLE);
agO.setVisibility(View.INVISIBLE);
agTw.setVisibility(View.INVISIBLE);
agTh.setVisibility(View.INVISIBLE);
agFo.setVisibility(View.INVISIBLE);
agFi.setVisibility(View.INVISIBLE);
agSi.setVisibility(View.INVISIBLE);
player.setVisibility(View.VISIBLE);
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.part2);
player.setVideoURI(uri);
player.start();
}
我真的不知道发生了什么 - 我已经通读了所有关于 MediaPlayer 和 VideoViews 的文档。它说可以同时输出 2 个音频流。但是没用。
原来 videoView 开始播放以某种方式暂停了媒体播放器。
解决问题的方法只是再次调用 mediaplayer.start() 。它确实在之前一直停止的地方恢复了。播放中的(显然存在的)短暂中断并不明显。
为什么 mediaplayer/videoview 的这种行为没有在任何地方提及?
问题解决代码:
z.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
playPart2();
mediaplayer.start();
}
});
}
}, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);
我只是偶然发现了这个不太明显的解决方案,我认为如果我分享我的发现可能会对某些人有所帮助。
有很多类似的问题,但他们没有帮助我解决我的问题。 (不同)
我有一个 activity 可以播放有声视频,然后显示图像 3 秒,然后显示动画地图视图 10 秒,然后播放另一个视频。
- 视频 1(~60 秒)
- 图像(~3 秒)
- 动画地图视图(~10 秒)
- 视频 2(~30 秒)
在第一个视频播放完毕后尝试播放音频时出现。 音频在地图视图期间播放良好,然后停止。 我尝试了各种场景,但音乐总是在发生变化时停止,尽管某些组合有效(例如,没有地图和视频 2(只是黑屏))。 我确实仔细查看了所有日志,但没有发现任何有用的信息。
问题是不是媒体播放器在完成之前正在 gc 或以某种方式完成。
private static MediaPlayer mediaplayer;
并在 OnCreate 中:
mediaplayer = new MediaPlayer();
AudioFocusRequest.Builder mp;
mediaplayer.setAudioAttributes(
new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
try {
mediaplayer.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.audio));
} catch (IOException e) {
e.printStackTrace();
Log.e("audio_management","error trying to set data source for audio");
}
try {
mediaplayer.prepare();
} catch (IOException e) {
e.printStackTrace();
Log.e("audio_management","error preparing");
}
这是我如何播放视频的示例
z.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
playPart2();
}
});
}
}, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);
这是 playPart2() 函数:
public void playPart2() {
ImageView imgbg = findViewById(R.id.imageView);
ImageView agO = findViewById(R.id.agent1);
ImageView agTw = findViewById(R.id.agent2);
ImageView agTh = findViewById(R.id.agent3);
ImageView agFo = findViewById(R.id.agent4);
ImageView agFi = findViewById(R.id.agent5);
ImageView agSi = findViewById(R.id.agent6);
VideoView player = findViewById(R.id.videoView);
MapView mMap = findViewById(R.id.map);
mMap.setVisibility(View.INVISIBLE);
imgbg.setVisibility(View.INVISIBLE);
agO.setVisibility(View.INVISIBLE);
agTw.setVisibility(View.INVISIBLE);
agTh.setVisibility(View.INVISIBLE);
agFo.setVisibility(View.INVISIBLE);
agFi.setVisibility(View.INVISIBLE);
agSi.setVisibility(View.INVISIBLE);
player.setVisibility(View.VISIBLE);
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.part2);
player.setVideoURI(uri);
player.start();
}
我真的不知道发生了什么 - 我已经通读了所有关于 MediaPlayer 和 VideoViews 的文档。它说可以同时输出 2 个音频流。但是没用。
原来 videoView 开始播放以某种方式暂停了媒体播放器。 解决问题的方法只是再次调用 mediaplayer.start() 。它确实在之前一直停止的地方恢复了。播放中的(显然存在的)短暂中断并不明显。
为什么 mediaplayer/videoview 的这种行为没有在任何地方提及?
问题解决代码:
z.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
playPart2();
mediaplayer.start();
}
});
}
}, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);