首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:在同一个SurfaceView中录制和播放视频

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

Stack Overflow用户
提问于 2015-05-08 16:16:30
回答 1查看 2.2K关注 0票数 5

我希望看到我目前正在录制的SurfaceView中的视频,如果重编码完成,我将在同一个SurfaceView中重放该视频。尽管我认为这将是应用程序中的一个常见特性,但我找不到任何示例,也无法使代码工作。

代码语言:javascript
复制
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();
}
}

//

代码语言:javascript
复制
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();
    }

}

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

提前感谢

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

EN

回答 1

Stack Overflow用户

发布于 2016-10-12 12:21:46

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

据我所知,只有在相同的表面视图被破坏和重新生成之后,才能重用相同的表面视图,也就是说,只有在调用了SurfaceView之后才能重用相同的surfaceCreated(),然后只有在此破坏之后才调用surfaceCreated(),并创建可以重用SurfaceView的循环。

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

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

  1. 创建活动时,检查VideoFile是否有效
  2. 如果是,请使用SurfaceView进行播放。
  3. 现在,如果用户删除视频重新启动活动
  4. 由于在意图中找不到VideoFile,所以使用SurfaceView进行记录
  5. 一旦录制完成,用户想要播放视频重新启动活动,并将VideoFile信息附加在意图中
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30128422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档