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

标签 android android-mediaplayer surfaceview 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();
}
}

//

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();
    }

}

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

提前致谢

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

最佳答案

If I just record the video my code works, if just play the video it works as well. Any ideas?

据我所知,只有在销毁和重新生成后才能重用相同的表面 View ,即只有在调用 surfaceDestroyed() 然后调用 surfaceCreated() 之后才能重用相同的 SurfaceView 仅在此销毁和创建循环之后调用,您可以重用 SurfaceView。

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

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

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

  2. 如果是,使用SurfaceView播放

  3. 现在如果用户删除视频重启 Activity

  4. 由于未找到 VideoFile Intent 使用 SurfaceView 进行录制

  5. 一旦录制完成并且用户想要重新开始播放视频 Intent 中附加了 VideoFile 信息的 Activity

关于Android:在同一个SurfaceView中录制和播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128422/

相关文章:

android - 如何使用 Android 的 “Surface” 类?

android - 如何提高最大音频输出功率

android - 电子邮件问题(在电子邮件正文中发送超链接)android

android - Android MediaPlayer seeTo 的精度

android - MediaPlayer 在 mp3 播放开始时卡顿

Android - SurfaceView(宽度,高度)问题

android - 如何以编程方式设置编辑文本的布局高度

android - Intent.ACTION_CALL 启动 skype 通话而不是 "normal"电话

java - Android 如何播放 Assets 文件夹中的媒体文件 (.mp4)

android - 为什么 Fragment 隐藏时 Fragment 中的 SurfaceView 仍然可见?