2014-02-25 129 views
0

我有休耕代码:渲染视频白色SurfaceView

public class MainActivity extends Activity { 
     MediaPlayer player; 
     Button playBtn; 
     FrameLayout frame; 
     boolean plaing = false; 
     Uri uri; 
     volatile boolean surfaceReady; 

     boolean drawCanvas = true; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      playBtn = (Button) findViewById(R.id.play); 
      playBtn.setOnClickListener(new CKL()); 
      frame = (FrameLayout) findViewById(R.id.FrameForVideo); 
      createSurfaceView(frame); 
      player = new MediaPlayer(); 
      player.setLooping(true); 
      String urri = "android.resource://com.example.videoplayer/raw/id_1_l_belen"; 
      uri = Uri.parse(urri); 
      Log.d("atf", urri); 
     } 

     @Override 
     protected void onPause() { 
      player.stop(); 
      player.reset(); 
      player.release(); 
      super.onPause(); 
     } 

     private class CKL implements OnClickListener{ 
      @Override 
      public void onClick(View v) { 
       if (!plaing) 
       { 
        try 
        { 
         player.setDataSource(MainActivity.this, uri); 
         player.setLooping(true); 
         player.prepare(); 
         player.start(); 
         plaing = true; 
         Log.d("atf", "Player started"); 
        } catch (Throwable e) { 
         Error er = new Error(e); 
         throw er; 
        } 
       } 
       else 
       { 
        surfaceReady = false; 
        player.stop(); 
        player.reset(); 
        plaing = false; 
        createSurfaceView(frame); 
       } 


      } 

     } 

     private class SurfaceCreationLisatener implements SurfaceHolder.Callback{ 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
       player.setDisplay(holder); 
      } 
      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) {} 

     } 

     private void createSurfaceView(FrameLayout frame){ 
      frame.removeAllViews(); 
      SurfaceView surfaceView = new SurfaceView(MainActivity.this); 
      ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      surfaceView.setLayoutParams(lp); 
      surfaceView.getHolder().addCallback(new SurfaceCreationLisatener());   
      frame.addView(surfaceView); 
     } 
    } 

基本上,我使用的MediaPlayer来呈现一个SurfaceView的视频。问题是这个SurfaceView是黑色的,设置背景颜色是没用的,因为它的行为不像普通的View。

基本上,我需要使这个视图的黑色背景看不见。在视频不播放时使整个表面不可见的变通办法不适合我。 我需要将表面放置在ListView中,即使正在播放视频,滚动时黑色表面也会闪烁。 (看起来很难看) 我也尝试过使用TextureView,但还有另外一个问题: 当一次发射多个视频时,由于在TextureView上渲染会消耗更多资源,因此这些视频会出现问题。

对我来说,解决方案就是将SurfaceView以白色着色,这样MediaPlayer就可以将其内容呈现在白色表面上,但我不知道如何做到这一点。 以下代码无法正常工作。

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    Canvas cnvs = holder.lockCanvas(); 
    cnvs.drawColor(Color.WHITE); 
    holder.unlockCanvasAndPost(cnvs); 
    player.setDisplay(holder); 
} 

绘制表面后,MediaPlayer没有显示任何东西。看起来它不使用表面。为什么?......不知道。

我会很感激任何来自你的想法。 谢谢。

回答

0

也许你可以试试这个:把你的surfaceview放在一个framelayout(它可以是你已经用在你的createSurfaceView上的那个),另一个视图放在你的surfaceview上面。这个新视图可以只是一个带有白色背景的按钮(甚至更好,缩略图或视频的静止帧),并将其设置为与surfaceview相同的宽度和高度。然后,在该按钮的onclick中,将其隐藏以显示曲面视图并播放视频。