我制作了一个带有surfaceview和mediaplayer的视频播放器。 我有10个视频和10个按钮。 如果点击每个按钮,则每个视频都在播放。
这是我的代码..
//onCreate
holder = surfaceview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//Button1
if(mp == null)mp = new MediaPlayer();
mp.setDataSource(mediaplay_path);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();
//Button2
if(mp != null){
mp.stop();
mp.reset();
}
mp.setDataSource(mediaplay_path2);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();
//Button3~Button10 is same as Button2..
一切都很好。
我的自定义视频查看工作正常。
但是当视频转到下一个视频时,上一个视频的最后一个场景会保留一段时间并转到下一个视频场景。
我认为这是因为在播放下一个视频之前,之前的表面视图应该是清晰的。 但我不知道如何清除表面视图或表面支架。
我已经搜索了这个,但只能找到如何播放视频,而不是如何清除从媒体播放器中消失的表面视图。
请帮助我~~!答案 0 :(得分:7)
花了我两个星期来解决这个问题。通过将surfaceholder设置为TRANSPARENT,Android将破坏表面。然后将其设置回OPAQUE会创建一个“清除”曲面的新曲面。注意surfacecreate和surfacedestroy事件会触发,所以如果你有代码,请注意。我将一个imageview设置为黑色,使其呈现黑色背景。可能有更好的方法。
private void playVideoA() {
imageViewBlack.bringToFront();
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
surfaceHolder.setFormat(PixelFormat.OPAQUE);
surfaceView.bringToFront();
mediaPlayerA.setDisplay(surfaceHolder);
//surfaceView.setAlpha((float) 0.01);
mediaPlayerA.start();
};
private void prepareVideoA(String url) {
try {
mediaPlayerA = new MediaPlayer();
mediaPlayerA.setDataSource(url);
mediaPlayerA.prepareAsync();
mediaPlayerA.setOnPreparedListener(this);
mediaPlayerA.setOnCompletionListener(this);
mediaPlayerA.setOnBufferingUpdateListener(this);
mediaPlayerA.setOnInfoListener(this);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
@Override
public void onPrepared(MediaPlayer mp) {
playVideoA()
}
答案 1 :(得分:2)
video.getHolder().setFormat(PixelFormat.TRANSPARENT);
video.getHolder().setFormat(PixelFormat.OPAQUE);
video.setVideoURI(Uri.parse(temp));
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
它对我有用
答案 2 :(得分:1)
可能是您可以使用removeView删除旧的自定义视频,然后添加新视图
答案 3 :(得分:1)
SurfaceHolder
具有lockCanvas
方法,可让您直接绘制到Surface
。使用drawColor
的{{1}}方法将其填充为黑色。
也就是说,最好删除Canvas
(由smile2you建议),因为这应该完全破坏SurfaceView
并释放未使用的资源。并且确保在完成播放后在Surface
上调用release
。持有太多视频资源会导致您的应用崩溃。
答案 4 :(得分:0)
surfaceview.setVisibility(View.GONE);