【问题标题】:how to clear surface holder when media player is finished?媒体播放器完成后如何清除表面支架?
【发布时间】:2012-08-07 09:28:18
【问题描述】:

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

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

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

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

请帮帮我~~!

【问题讨论】:

    标签: android surfaceview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我花了两个星期才弄明白。通过将 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()
      }
      

      【讨论】:

      • 为什么不在 SurfaceHolder 上使用 lockCanvas 并用黑色填充 Surface?
      • 'surfaceHolder.setFormat(PixelFormat.TRANSPARENT);surfaceHolder.setFormat(PixelFormat.OPAQUE);'为我工作。但它到底做了什么?!
      【解决方案3】:

      SurfaceHolder 具有lockCanvas 方法,可让您直接绘制到Surface。使用Canvas 的drawColor 方法将其填充为黑色。

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

      【讨论】:

      • 这是最好的解决方案?有没有办法在下一个视频之前清除 SurfaceHolder?
      • void ClearTextureView() { var cnv = _textureView.LockCanvas(); cnv.DrawColor(Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); _textureView.UnlockCanvasAndPost(cnv); }
      【解决方案4】:
      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();
         }
      });
      

      对我有用

      【讨论】:

        【解决方案5】:

        surfaceview.setVisibility(View.GONE);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多