2014-02-25 134 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中,將其隱藏以顯示曲面視圖並播放視頻。