【问题标题】:Android MediaMuxer Attaching Surface to Codec inputAndroid MediaMuxer 将 Surface 附加到编解码器输入
【发布时间】:2014-06-20 00:44:37
【问题描述】:

好的,我已经查看了 Fadden's example 的实现 Android MediaMux。我不确定如何将我的场景输入到 MP4 多路混合编解码器的表面输入中。我正在开发一个音频处理器,它会占用音频和视频 I/O,因此 MediaRecord 失败,但 MediaMux 听起来是一个可行的解决方案。

从编解码器创建一个 inputSurface:

videoInputSurface = codec.createInputSurface();

我已经实现了 openGLSurfaceView。我可以通过调用从视图中获取表面:

myGLSurface = myGLView.getHolder().getSurface();

但这并没有设置表面。它只是抓住它。有没有一种简单的方法可以让 myGLSurface 写入 videoInputSurface。

为了使事情更复杂,我将 cameraPreview 添加到同一个视图组 vg,myGLView 被写入:

vg.addView(mCameraPreview);

myGLView 设置为透明,以便 openGL 场景覆盖在 cameraPreview 之上。

myGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

有没有一种简单的方法来获取 vg 的表面元素?简单地将写入 vg 帧的内容放在编解码器的 videoInputSurface 上?

谢谢,

【问题讨论】:

  • 要明确一点:您想从相机中获取帧,使用 OpenGL 在它们之上绘制,然后将结果发送到视频编码器?这也需要出现在屏幕上吗? (这可能有助于根据您正在尝试做什么来重新表述问题,而不是描述您当前已实施的内容。)
  • 是的,这是正确的,从相机获取帧,通过 OpenGL 在顶部绘制,然后发送到视频编码器......显然需要预览或显示。我可以写下我正在尝试做的事情,但我相信那会更糟,所以要坚持基础。

标签: android opengl-es android-mediacodec muxer


【解决方案1】:

尝试查看this。第一个example 展示了如何通过OpenGL ES 命令在编解码器输入表面上进行绘制,以通过MediaMuxer 将其记录到MP4 文件中。

【讨论】:

  • 好的,让我看看我是否正确。在我创建编解码器表面之后,我使用它在我的 openGL 内容中创建一个 eglsurface,然后每次我想要将我正在绘制的内容渲染到编解码器时简单地交换缓冲区?这会拿起我的 cameraPreview 还是需要将其推送到 openGL 纹理?
  • 当您查看示例时,您可以看到 testEncodeVideoToMp4 函数。如果你有 Open GL 渲染器,你需要在主 for 循环和来自 onDrawFrame 的命令移动到 generateSurfaceFrame 之前执行来自 onSurfaceCreatedonSurfaceChanged 的命令 函数。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多