gpt4 book ai didi

android - 如何将相机预览传递给 MediaCodec.createInputSurface() 创建的 Surface?

转载 作者:可可西里 更新时间:2023-11-01 18:46:47 31 4
gpt4 key购买 nike

理想情况下,我想实现两个目标:

  1. 通过 SurfaceCamera 预览数据传递给 MediaCodec 编码器。我可以使用 MediaCodec.createInputSurface() 创建 SurfaceCamera.setPreviewDisplay() 需要一个 SurfaceHolder,不是 Surface
  2. 除了将 Camera 预览数据传递给编码器外,我还想在屏幕上显示预览(这样用户就可以真正看到他们正在编码的内容)。如果不涉及编码器,那么我会使用 SurfaceView,但这在这种情况下似乎不起作用,因为 SurfaceView 创建了自己的 Surface,我想我需要使用 MediaCodec 创建的那个。

我在网上搜索了很多解决方案,但没有找到。关于 bigflake.com 的一些例子似乎是朝着正确方向迈出的一步,但他们采用的方法增加了我想避免的一堆 EGL/SurfaceTexture 开销。我希望有一个更简单的示例或解决方案,我可以让 CameraMediaCodec 更直接地对话而不涉及 EGL 或纹理。

最佳答案

从 Android 4.3 (API 18) 开始,bigflake CameraToMpegTest 方法是正确的方法。

EGL/SurfaceTexture 开销目前是不可避免的,尤其是对于您要在目标 #2 中执行的操作。想法是:

  • 配置相机将输出发送到 SurfaceTexture .这使得相机输出可作为“外部纹理”提供给 GLES。
  • 渲染 SurfaceTextureSurfaceMediaCodec#createInputSurface() 返回.为视频编码器提供数据。
  • 渲染 SurfaceTexture第二次,到 GLSurfaceView .这会将其显示在显示器上以进行实时预览。

唯一发生的数据复制是由 GLES 驱动程序执行的,因此您正在执行硬件加速 blits,速度会很快。

唯一棘手的一点是您希望外部纹理可用于两个不同的 EGL 上下文(一个用于 MediaCodec,一个用于 GLSurfaceView)。您可以在 bigflake 上的“Android Breakout 游戏记录器补丁”示例中看到创建共享上下文的示例——它会渲染游戏两次,一次到屏幕,一次到 MediaCodec。编码器。

更新:这是在Grafika中实现的(“显示 + 捕获相机”)。

更新:“显示+捕获相机”方法中的多上下文方法是somewhat flawed . “持续捕获”Activity 使用普通的 SurfaceView,并且能够使用单个 EGL 上下文进行屏幕渲染和视频录制。这是推荐的。

关于android - 如何将相机预览传递给 MediaCodec.createInputSurface() 创建的 Surface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643057/

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