在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。
以下是2段源码,第1段有声音无图像,第2段有声音有图像
源码1:有声音无图像
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MainActivity extends Activity
- {
- private SurfaceView surfaceView = null ;
- private SurfaceHolder surfaceHolder = null ;
- private MediaPlayer mp = null ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- surfaceView = new SurfaceView(this);
- surfaceHolder = surfaceView.getHolder();
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- setContentView(surfaceView);
- mp = new MediaPlayer();
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.setDisplay(surfaceHolder);
- try {
- mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- mp.prepare();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mp.start();
- }
- }
源码2:有声音有图像
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MainActivity extends Activity implements SurfaceHolder.Callback
- {
- private SurfaceView surfaceView = null ;
- private SurfaceHolder surfaceHolder = null ;
- private MediaPlayer mp = null ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- surfaceView = new SurfaceView(this);
- surfaceHolder = surfaceView.getHolder();
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceHolder.addCallback(this);
- setContentView(surfaceView);
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- // TODO Auto-generated method stub
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- mp = new MediaPlayer();
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.setDisplay(surfaceHolder);
- try {
- mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- mp.prepare();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mp.start();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- }