9

我正在创建一个录像机,并想创建视频播放器来预览录制的视频。修改此页面的代码,我通过以下方式创建了一个 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();,但是屏幕是空白的(屏幕上只有按钮)。

有谁知道上面的代码可能有什么问题,或者有没有可以在网络上使用的示例?

我将衷心感谢您的帮助

4

2 回答 2

6

创建表面后,您需要将表面附加到播放器上。

称呼

 mp.setDisplay(mPreview.getHolder());

从内部

public void surfaceCreated(SurfaceHolder holder)
于 2010-07-29T18:31:58.460 回答
6

即兴发挥,我认为您在某些回调方法中需要更多逻辑,例如surfaceCreated().

于 2009-07-27T14:55:03.200 回答