我正在创建一个录像机,并希望创建视频播放器来预览录制的视频。修改代码from this page我已按以下方式创建了MediaPreview类:
public class MediaPreview extends Activity implements OnErrorListener,
OnBufferingUpdateListener,
OnCompletionListener, OnPreparedListener, SurfaceHolder.Callback{
private static final String TAG = "MediaPreview";
private MediaPlayer mp;
private SurfaceView mPreview;
private SurfaceHolder holder;
private Button btnPlay;
private Button btnPause;
private Button btnReset;
private Button btnStop;
private String mPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media_preview);
mPreview = (SurfaceView)findViewById(R.id.mPreview);
btnPlay = (Button)findViewById(R.id.btnPlay);
btnPause = (Button)findViewById(R.id.btnPause);
btnReset = (Button)findViewById(R.id.btnReset);
btnStop = (Button)findViewById(R.id.btnStop);
getPathFromParentDialog();
btnPlay.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
playVideo();
}
});
btnPause.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(mp != null){
mp.pause();
}
}
});
btnReset.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.seekTo(0);
}
}
});
btnStop.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.stop();
mp.release();
}
}
});
getWindow().setFormat(PixelFormat.TRANSPARENT);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setFixedSize(400, 300);
}
@Override
protected void onResume() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onResume();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if(mp != null){
mp.stop();
mp.release();
}
return false;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
}
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
}
@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
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
private void playVideo() {
try{
mp = new MediaPlayer();
mp.setOnErrorListener(this);
mp.setOnBufferingUpdateListener(this);
mp.setOnCompletionListener(this);
mp.setOnPreparedListener(this);
mp.setAudioStreamType(2);
mp.setDisplay(mPreview.getHolder());
Runnable r = new Runnable(){
@Override
public void run() {
try{
setDataSource(mPath);
}
catch(Exception ex){
Log.e(TAG, ex.getMessage());
}
try {
mp.prepare();
Log.v(TAG, "Duration: ===> " + mp.getDuration());
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
mp.start();
}
};
new Thread(r).start();
}
catch(Exception ex){
String sDummy = ex.toString();
if(mp != null){
mp.stop();
mp.release();
}
}
}
private void setDataSource(String path) throws IOException {
if(!URLUtil.isNetworkUrl(mPath)){
mp.setDataSource(mPath);
}
else{
URL url = new URL(mPath);
URLConnection cn = url.openConnection();
cn.connect();
InputStream stream = cn.getInputStream();
if(stream == null){
throw new RuntimeException("stream is null");
}
File fileTemp = File.createTempFile("mediaplayerTmp", "dat");
String tempPath = fileTemp.getAbsolutePath();
FileOutputStream out = new FileOutputStream(fileTemp);
byte buf[] = new byte[128];
do{
int numRead = stream.read(buf);
if(numRead <= 0){
break;
}
out.write(buf, 0, numRead);
}while(true);
mp.setDataSource(tempPath);
try{
stream.close();
}
catch(Exception ex){
String sDummy = ex.toString();
}
}
}
private void getPathFromParentDialog()
{
Intent intent = getIntent();
mPath = intent.getExtras().getString(MediaLibrary.FILENAME);
}
}
代码成功执行(没有任何例外)until mp.start();
,但屏幕为空白(屏幕上只有按钮)。
有没有人知道上面代码中可能出现的问题,或者网上是否有任何可用的示例?
我真的很感谢你的帮助
答案 0 :(得分:6)
关闭袖口,我认为你的一些回调方法需要更多的逻辑,比如surfaceCreated()
。
答案 1 :(得分:6)
创建曲面后,您需要将曲面附加到播放。
致电
mp.setDisplay(mPreview.getHolder());
来自内部
public void surfaceCreated(SurfaceHolder holder)