您的位置:首页 > 移动开发 > Android开发

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

2012-05-21 19:45 585 查看
在用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

}

}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息