【问题标题】:MediaCodec decoding to surface nativelyMediaCodec 解码以原生方式呈现
【发布时间】:2015-03-23 22:02:45
【问题描述】:

我正在使用 MediaCodec 的解码器将数据输出到表面。使用 .configure 函数,我传递了一个通过 surfaceComposerClient 创建的表面。问题是编解码器无法启动。我认为这是我的表面设置方式的问题(当我将表面设置为 NULL 时编解码器启动)

查看 MediaCodec 解码器 java 示例,我似乎需要创建一个支持 EGL 的 SurfaceTexture。是否可以使用 C++/NDK 本地创建表面纹理?有这方面的例子吗?

【问题讨论】:

    标签: android android-ndk android-mediacodec


    【解决方案1】:

    我认为这不是一个“普通”应用,因为您直接与 SurfaceFlinger 交互。

    您可以在一些内部 OpenGL 测试中找到示例——代码已针对 5.0 Lollipop 版本进行了修复。看一下San Angeles demo,它使用WindowSurface 类从SurfaceComposerClient 获取表面。

    您不需要 SurfaceTexture 或使用 EGL 执行任何操作,即可将视频解码到表面。 Surface 具有生产者-消费者结构,EGL 和 MediaCodec 是生产者的两个不同示例。 (SurfaceFlinger 是消费者。)

    要知道 MediaCodec 失败的原因绝非易事。您可以尝试使用 GLES 在表面上绘图,看看它是否有效,但我猜您的问题出在其他地方。

    对于 SurfaceTexture,应用既是生产者也是消费者;它提供了一种将视频解码为表面的方法,然后您可以将其作为 GLES 纹理进行操作。如果您只想在屏幕上播放视频,这会增加不必要的开销。

    【讨论】:

      【解决方案2】:

      参考Android-4.4源码中的SimplePlayer.h&.cpp。它用于解码媒体文件并将解码后的视频输出到表面。我认为这与您的情况相似。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 2016-02-21
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        相关资源
        最近更新 更多