gpt4 book ai didi

Android 使用 MediaRecorder 从 SURFACEVIEW 录制视频

转载 作者:太空狗 更新时间:2023-10-29 16:35:43 26 4
gpt4 key购买 nike

我是新来的。

我在 android 中有一个应用程序可以通过网络流式传输相机并有一个 surfaceView 组件来显示预览(我正在流式传输的内容)。

我想在不重新打开相机的情况下记录我在预览(表面 View )中看到的内容,因为它只是从流媒体中打开。

在 lollipop 中,我看到您可以使用 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 中的内容。

最佳答案

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

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

方法 #1:简单的方法?不是将视频发送到 SurfaceView 的 Surface,而是将 MediaRecorder 置于 SURFACE 输入模式,并将其输入 Surface(从 getSurface() 获得)传递给播放器。然后,调用 MediaRecorder 的 setPreviewDisplay与 SurfaceView 的表面。理论上,您应该可以在录制视频时“预览”视频。

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

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

  1. 在新的 EGL 上下文中创建 SurfaceTexture。
  2. 将视频播放器的输出定向到 SurfaceTexture 而不是 SurfaceView。
  3. 从 SurfaceView 获取 Surface(用于显示),从 MediaRecorder 获取 Surface(用于记录)。后者来自getSurface() .
  4. 当每个帧从 SurfaceTexture 可用时,将其渲染到两个 Surfaces。

这种方法的工作量要大得多,但更灵活,允许在显示和/或记录之前对图像进行操作。可以在 Grafika 中找到一些使用较低级别 MediaCodec 而不是 MediaRecorder 的示例.

关于Android 使用 MediaRecorder 从 SURFACEVIEW 录制视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com