来自SURFACEVIEW的Android录制视频使用MediaRecorder

时间:2015-04-09 12:04:11

标签: android surfaceview android-mediarecorder video-recording

我是新来的。

我在Android中有一个应用程序通过网络传输摄像头,并有一个surfaceView组件来显示预览(我正在流式传输)。

我想在没有重新打开相机的情况下记录我在预览(surfaceview)中看到的内容,因为它刚刚从流媒体中打开。

在棒棒糖中,我看到你可以使用MediaRecorder api录制并将视频源设置为SURFACE。

如何记录只需添加一个从曲面录制的新MediaRecorder对象。假设你有所有的东西设置,应用程序工作和流,在surfaceview组件中显示预览。我想定义一个新的记录器,将源设置为surfaceview。

由于

编辑:

嗨,我已尝试使用此代码进行录制:

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(getVideoFile(activity, true).getAbsolutePath());
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation);
mMediaRecorder.setOrientationHint(orientation);
mMediaRecorder.prepare();

考虑您拥有打开相机并流出网络并在surfaceView中显示预览的应用。我想添加一个新的mediarecorder来记录surfaceview中的内容。

3 个答案:

答案 0 :(得分:4)

您无法从SurfaceView录制。当您将视频播放到SurfaceView时,帧将被发送到Surface,这是一个具有生产者 - 消费者接口的缓冲区队列。该应用程序只能访问生产者端 - 系统图形合成器(SurfaceFlinger)是消费者。

您需要做的是播放视频两次,一次用于演示,一次用于录制。两次解码相同的视频流效率很低,因此您希望将每个解码的帧渲染两次。我还没有使用MediaRecorder,所以我会提供两种方法。

方法#1:简单方法?不是将视频发送到SurfaceView的Surface,而是将Me​​diaRecorder置于SURFACE输入模式,并将其输入Surface(从getSurface()获得)传递给播放器。然后,使用SurfaceView的Surface调用MediaRecorder'} setPreviewDisplay。理论上应该给你一个"预览"您正在录制的视频。

方法#2:通过SurfaceTexture运行视频。 SurfaceTexture的Surface在应用程序中同时具有生产者和消费者界面,因此您可以访问生成的框架。

这确实涉及OpenGL ES的一些工作。基本步骤是:

  1. 在新的EGL上下文中创建SurfaceTexture。
  2. 将视频播放器的输出定向到SurfaceTexture而不是SurfaceView。
  3. 从SurfaceView获取Surface(用于显示),从MediaRecorder获取Surface(用于录制)。后者来自getSurface()
  4. 当SurfaceTexture中的每个帧都可用时,将其渲染到两个Surfaces。
  5. 这种方法工作量大得多,但更灵活,允许在显示和/或记录之前操纵图像。可以在Grafika中找到使用较低级别MediaCodec而不是MediaRecorder的一些示例。

答案 1 :(得分:1)

对于程序员有记录问题我使用Mediacodec api解决了onpreviewframe和ffmpeg获得的yuvimages。

答案 2 :(得分:0)

你说我要播放两次视频..是否可以打开相机2次? 在这种情况下,请考虑我有一个编码方法可以在相机回调中使用Mediacodec exploting onpreviewframe函数进行流式处理。

我是否可以添加MediaRecorder实例绑定以及也记录的相机?我的意思是相机刚刚为流打开,我想将MediaRecorder绑定添加到现有的Camera对象。