Android:如何将解码器集成到多媒体框架中

8
最近,我已经成功地将一个视频解码器移植到了Android上。同时,我还将输出转储到了SurfaceView,并使用本地API检查了输出。现在的下一个任务是实现播放、暂停、流等功能,也就是媒体播放器的其他特性。这将是一项重新工作,因为所有这些功能已经在Android多媒体框架中定义好了。我听说我们可以将我们的解码器作为插件,并将其集成到Android的多媒体框架中。虽然我在谷歌上搜索过相关信息,但几乎找不到任何有用的信息。所以我请求读者提供一些相关链接或解决方案。谢谢,期待你的回复。
1个回答

17
在Android SF框架中,编解码器是通过media_codecs.xml进行注册的。在标准的Android发行版本中,可以在此处找到一个示例media_codecs.xml这里。所有音视频组件都被注册为OMX组件。 1. 编解码器注册 要注册您的视频解码器,您需要在<Decoders>列表下添加一个新条目。为了确保您的编解码器始终被选中,请确保它在具体MIME类型的第一条目录中列出。以下是H.264解码器的示例条目。
<Decoders>
    <MediaCodec name="OMX.ABC.XYZ.H264.DECODER" type="video/avc" >
        <Quirk name="requires-allocate-on-input-ports" />
        <Quirk name="requires-allocate-on-output-ports" />
    </MediaCodec>
    <MediaCodec name="OMX.google.h264.decoder" type="video/avc" />

在这里,

a. OMX.ABC.XYZ.H264.Decoder 是你组件的名称。

b. video/avc 是你组件的 MIME 类型。在此示例中,它表示一个AVC / H.264视频解码器。

c. 接下来的两个语句表示你组件的 quirks特殊要求。在给定的示例中,requires-allocate-on-input-ports 指示 Stagefright 框架,该组件更喜欢在所有输入端口上分配缓冲区。类似地,另一个 quirk 表示该组件也更愿意在其输出端口上进行分配。要查看系统支持的 quirks 列表,可以参考文件 OMXCodec.cpp 中的函数 OMXCodec::getComponentQuirks。这些 quirks 转换为标志,然后由框架读取以创建和初始化组件。

在这个示例中,你的 OMX 组件是在 默认 Google 实现的视频解码器之前注册的。

注意:如果你在最终的 media_codecs.xml 文件中尝试此操作,则必须确保该条目被反映。

2. OMX核心注册

为了创建你的组件并确保调用正确的工厂方法,你可能需要Stagefright 框架注册你的 OMX 核心。

要注册一个新的核心,你必须创建一个名为 libstagefrighthw.so 的新库,它将位于你的最终系统中的 /system/lib。这个库必须公开一个 createOMXPlugin 符号,该符号将被 dlsym 查找。

OMX 核心的注册如下:OMXMaster 调用 addVendorPlugin,后者在内部调用 addPlugin("libstagefrighthw.so")。在 addPlugin 中,将使用 createOMXPlugin 进行查找,使用它初始化其他函数指针,例如 makeComponentInstancedestroyComponentInstance 等。

一旦初始化了 OMX 核心,你就可以在 Android 框架中运行自己的组件了。可以在此处找到 OMXMaster 的参考资料:这里

通过这些更改,你的视频解码器已经集成到了 Android stagefright 框架中。


非常感谢您的回复。不过我有点困惑。 - Zax
假设我有一个项目,其中包含一个文件浏览器来选择输入文件进行解码,以及一个解码按钮来解码输入文件。我该如何继续上述步骤?期待您的回复。提前致谢。 - Zax
@Zax 我已经在另一个帖子中回答了这个问题,链接在这里:https://dev59.com/sW_Xa4cB1Zd3GeqP2Idt - Ganesh
@Ganesh,上述过程是否需要您再次使用更改后的libstagefrighthw.so构建整个源代码? - Steve
1
@Steve.. 首先,您可以构建 libstagefrighthw.so 并替换 /system/lib 中的库。替换库后,您需要重新启动 mediaserver,然后就可以愉快地使用您的更改了。在下一次整体构建中,更改将自动成为构建系统和 system.img 的一部分,无需您采取任何其他步骤。希望这可以帮助到您。 - Ganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接