Android SurfaceView播放视频有声音无图像有关问题

Android SurfaceView播放视频有声音无图像问题

在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。

 

以下是2段源码,第1段有声音无图像,第2段有声音有图像

 

源码1:有声音无图像

[html] view plaincopy
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.MediaPlayer;  
  4. import android.os.Bundle;  
  5. import android.view.SurfaceHolder;  
  6. import android.view.SurfaceView;  
  7.   
  8. public class MainActivity extends Activity  
  9. {     
  10.     private SurfaceView surfaceView = null ;  
  11.     private SurfaceHolder surfaceHolder = null ;  
  12.     private MediaPlayer mp = null ;  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState)    
  17.     {  
  18.         super.onCreate(savedInstanceState);  
  19.         surfaceView = new SurfaceView(this);  
  20.         surfaceHolder = surfaceView.getHolder();          
  21.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  22.         setContentView(surfaceView);  
  23.           
  24.         mp = new MediaPlayer();          
  25.         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  26.         mp.setDisplay(surfaceHolder);  
  27.         try {  
  28.             mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");  
  29.         } catch (Exception e) {  
  30.             // TODO Auto-generated catch block  
  31.             e.printStackTrace();  
  32.         }  
  33.         try {  
  34.             mp.prepare();  
  35.         } catch (Exception e) {  
  36.             // TODO Auto-generated catch block  
  37.             e.printStackTrace();  
  38.         }  
  39.         mp.start();         
  40.   
  41.     }  
  42. }  


 

 

源码2:有声音有图像

[html] view plaincopy
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.MediaPlayer;  
  4. import android.os.Bundle;  
  5. import android.view.SurfaceHolder;  
  6. import android.view.SurfaceView;  
  7.   
  8. public class MainActivity extends Activity implements SurfaceHolder.Callback  
  9. {     
  10.     private SurfaceView surfaceView = null ;  
  11.     private SurfaceHolder surfaceHolder = null ;  
  12.     private MediaPlayer mp = null ;  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState)    
  17.     {  
  18.         super.onCreate(savedInstanceState);  
  19.         surfaceView = new SurfaceView(this);  
  20.         surfaceHolder = surfaceView.getHolder();          
  21.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  22.         surfaceHolder.addCallback(this);  
  23.         setContentView(surfaceView);  
  24.           
  25.   
  26.     }  
  27.   
  28.     @Override  
  29.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  30.             int height) {  
  31.         // TODO Auto-generated method stub  
  32.           
  33.     }  
  34.   
  35.     @Override  
  36.     public void surfaceCreated(SurfaceHolder holder) {  
  37.         // TODO Auto-generated method stub  
  38.         mp = new MediaPlayer();          
  39.         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  40.         mp.setDisplay(surfaceHolder);  
  41.         try {  
  42.             mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");  
  43.         } catch (Exception e) {  
  44.             // TODO Auto-generated catch block  
  45.             e.printStackTrace();  
  46.         }  
  47.         try {  
  48.             mp.prepare();  
  49.         } catch (Exception e) {  
  50.             // TODO Auto-generated catch block  
  51.             e.printStackTrace();  
  52.         }  
  53.         mp.start();  
  54.     }  
  55.   
  56.     @Override  
  57.     public void surfaceDestroyed(SurfaceHolder holder) {  
  58.         // TODO Auto-generated method stub  
  59.           
  60.     }  
  61.