安卓:如何创建视频播放器?(Android: How to create video player?

2019-06-26 22:23发布

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

有谁知道什么可能是错的上面或代码有没有在网络上工作的任何可用的例子吗?

我将衷心感谢您的帮助

Answer 1:

即兴,我认为你需要在你的一些回调方法更多的逻辑,像surfaceCreated()



Answer 2:

您需要在创建表面后表面连接到播放。

呼叫

 mp.setDisplay(mPreview.getHolder());

从内部

public void surfaceCreated(SurfaceHolder holder)


文章来源: Android: How to create video player?