- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
理想情况下,我想实现两个目标:
Surface
将 Camera
预览数据传递给 MediaCodec
编码器。我可以使用 MediaCodec.createInputSurface()
创建 Surface
但 Camera.setPreviewDisplay()
需要一个 SurfaceHolder
,不是 Surface
。 Camera
预览数据传递给编码器外,我还想在屏幕上显示预览(这样用户就可以真正看到他们正在编码的内容)。如果不涉及编码器,那么我会使用 SurfaceView
,但这在这种情况下似乎不起作用,因为 SurfaceView
创建了自己的 Surface
,我想我需要使用 MediaCodec
创建的那个。我在网上搜索了很多解决方案,但没有找到。关于 bigflake.com 的一些例子似乎是朝着正确方向迈出的一步,但他们采用的方法增加了我想避免的一堆 EGL/SurfaceTexture 开销。我希望有一个更简单的示例或解决方案,我可以让 Camera
和 MediaCodec
更直接地对话而不涉及 EGL 或纹理。
最佳答案
从 Android 4.3 (API 18) 开始,bigflake CameraToMpegTest 方法是正确的方法。
EGL/SurfaceTexture 开销目前是不可避免的,尤其是对于您要在目标 #2 中执行的操作。想法是:
SurfaceTexture
.这使得相机输出可作为“外部纹理”提供给 GLES。SurfaceTexture
到 Surface
由 MediaCodec#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/
在我的 Android 应用程序中,我需要在 gpu 中对实时摄像头视频进行编码。这是一些相关代码: MediaFormat format = MediaFormat.createVideoF
理想情况下,我想实现两个目标: 通过 Surface 将 Camera 预览数据传递给 MediaCodec 编码器。我可以使用 MediaCodec.createInputSurface() 创建
当使用表面作为输入时,是否可以触发编码器发送 i 帧?我知道在排队输入缓冲区时是可能的,但是在使用 createInputSurface 时我没有找到这样做的方法。 最佳答案 您不能在缓冲区上设置标志
我有 MediaMuxer: MediaMuxer mMediaMuxer = new MediaMuxer(new File(Environment.getExternalStorageDirect
我是一名优秀的程序员,十分优秀!