我希望看到我目前正在录制的SurfaceView中的视频,如果重编码完成,我将在同一个SurfaceView中重放该视频。尽管我认为这将是应用程序中的一个常见特性,但我找不到任何示例,也无法使代码工作。
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();
}
}如果我只记录视频,我的代码工作,如果只播放视频,它也工作。有什么想法吗?
提前感谢
编辑:作为当前的解决方案,我使用两个SurfaceViews并在需要时“隐藏”它们(将大小设置为0)
发布于 2016-10-12 12:21:46
如果我只记录视频,我的代码工作,如果只播放视频,它也工作。有什么想法吗?
据我所知,只有在相同的表面视图被破坏和重新生成之后,才能重用相同的表面视图,也就是说,只有在调用了SurfaceView之后才能重用相同的surfaceCreated(),然后只有在此破坏之后才调用surfaceCreated(),并创建可以重用SurfaceView的循环。
要实现这一点,您所要做的就是:视频录制完成后,将SurfaceView可见性设置为GONE,这将确保surfaceDestroyed()回拨,再次将SurfaceView可见性设置为VISIBLE,在开始视频播放之后调用surfaceCreated()。
这是一个非常麻烦的过程,所以我使用相同的SurfaceView以下列方式录制和播放:
SurfaceView进行播放。SurfaceView进行记录https://stackoverflow.com/questions/30128422
复制相似问题