Android:在同一SurfaceView中录制和播放视频

Alj*_*oSt 5 android surfaceview android-mediaplayer android-mediarecorder

我想在SurfaceView中看到我正在录制的视频,如果重新编写完成,我想在同一个SurfaceView中重放视频.即使我认为这将是Apps中的常见功能,但我找不到任何示例,也无法使我的代码工作.

private void prepareRecorder() {
try {
    recorder = new MediaRecorder();
    recorder.setPreviewDisplay(holder.getSurface());

    camera.unlock();
    recorder.setCamera(camera);

    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

    camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
    recorder.setProfile(camcorderProfile);

    File newFile = new File(videoFilePath);

    recorder.setOutputFile(newFile.getAbsolutePath());

    try {
        recorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}catch(Exception e){
    releaseCamera();
}
}
Run Code Online (Sandbox Code Playgroud)

//

public void onClick(View v) {


    if(mediaPlayer!=null) {
        mediaPlayer.reset();
        mediaPlayer.release();
    }
    mediaPlayer = new MediaPlayer();



    try {
        mediaPlayer.setDataSource(videoFile.getAbsolutePath());
        SurfaceView surfaceView = (SurfaceView) getView().findViewById(R.id.videoInvitationFragSurfaceView);

        mediaPlayer.setSurface(surfaceView.getHolder().getSurface());
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

如果我只记录视频,我的代码可以正常工作,如果只是播放视频,它也能正常工作.有任何想法吗?

提前致谢

编辑:作为当前的解决方法,我使用两个SurfaceView并根据需要"隐藏"它们(将大小设置为0)

DCo*_*der 0

如果我只是录制视频,我的代码就可以工作,如果只是播放视频,它也可以工作。有任何想法吗?

据我了解,只有在销毁并重新生成后,您才能重用相同的 Surface View,即只有在surfaceDestroyed()被调用之后才能重用相同的 SurfaceView,然后surfaceCreated()只有在这个销毁和创建周期之后调用,您才能重用 SurfaceView。

要实现这一点,您所要做的就是:视频录制完成后,将 SurfaceView 可见性设置为 GONE,这将确保surfaceDestroyed()回调,并再次将 SurfaceView 可见性设置为 VISIBLE,这将surfaceCreated()在开始视频播放后调用。

这是一个非常麻烦的过程,所以我使用相同的 SurfaceView 按以下方式进行录制和播放:

  1. 创建 Activity 时检查 VideoFile 在 Intent 中是否可用

  2. 如果是,则用于SurfaceView播放

  3. 现在如果用户删除视频重新启动活动

  4. SurfaceView由于在用于录制的意图中未找到 VideoFile

  5. 录制完成后,用户想要播放视频,然后重新启动 Activity,并在 Intent 中附加视频文件信息