14

我用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..

一切安好。我的自定义视频视图工作正常。但是当视频转到下一个视频时,上一个视频的最后一个场景会保留一段时间,然后转到下一个视频场景。

我认为这是因为在播放下一个视频之前应该清楚之前的表面视图。但我不知道如何清除表面视图或表面支架。

我已经搜索过了,但只能找到如何播放视频,而不是如何清除设置为从媒体播放器显示的表面视图。

请帮帮我~~!

4

5 回答 5

7

我花了两个星期才弄清楚这一点。通过将 surfaceholder 设置为 TRANSPARENT,Android 将破坏表面。然后将其设置回 OPAQUE 会创建一个“清除”表面的新表面。注意surfacecreate 和surfacedestroy 事件将会触发,所以如果你有代码,请小心。我将图像视图设置为黑色以使其具有黑色背景。也许有更好的方法。

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()
}
于 2013-09-19T23:36:18.337 回答
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();
   }
});

它对我有用

于 2014-11-20T04:14:49.783 回答
1

可能您可以使用 removeView 删除旧的自定义视频视图,然后添加新视图

于 2013-07-21T09:13:44.710 回答
1

具有允许您直接绘制SurfaceHolder到. 使用 的方法将其填充为黑色。lockCanvasSurfacedrawColorCanvas

也就是说,最好删除SurfaceView(如smile2you建议的那样),因为这应该Surface完全破坏并释放未使用的资源。并且一定要确保你在他们完成播放后调用releases MediaPlayer。持有过多的视频资源会使您的应用程序崩溃。

于 2013-09-20T02:07:55.497 回答
0

surfaceview.setVisibility(View.GONE);

于 2017-05-22T05:54:27.220 回答