8

最近我成功地将视频解码器移植到了安卓。还将输出转储到表面视图并使用本机 API 检查输出。现在下一个任务是实现播放、暂停、流媒体等,即媒体播放器的其他功能。这样做将是一个返工,因为所有这些功能都已经在 android 多媒体框架中定义了。听说我们可以把我们的解码器做成一个插件,集成到Android的多媒体框架中。尽管我在谷歌上搜索过相同的内容,但我几乎找不到任何有关相同的信息。所以我恳请任何读者为上述问题提出一些相关的链接或解决方案。提前致谢,等待您的回复。

4

1 回答 1

17

在 Android SF 框架中,编解码器通过media_codecs.xml. media_codecs.xml在标准的 android 发行版中,可以在这里找到一个示例。所有视听组件都注册为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" />

在哪里,

一种。OMX.ABC.XYZ.H264.Decoder是您的组件的名称

湾。video/avcMIME您的组件的类型。在此示例中,它表示AVC / H.264视频解码器。

c.接下来的 2 个陈述表示您的组件的quirks特殊要求。在给定的示例中,requires-allocate-on-input-portsStagefright框架指示组件更愿意在其所有输入端口上分配缓冲区。同样,另一个quirk通知该组件也将更喜欢在其输出端口上进行分配。系统支持的列表quirks可以参考OMXCodec.cpp文件OMXCodec::getComponentQuirks中的函数。这些怪癖转化为标志,然后由框架读取以创建和初始化组件。

在示例插图中,显示您的OMX组件在默认的Google 实现的视频解码器之前注册。

注意:如果您在终端设备上尝试此操作,则必须确保此条目反映在最终media_codecs.xml文件中。

2. OMX核心注册

要创建您的组件并确保调用正确的工厂方法,您可能必须向框架注册您的OMX核心。Stagefright

要注册一个新内核,您必须创建一个名为的新库libstagefrighthw.so,该库将位于/system/lib您的终端系统中。该库必须公开一个createOMXPlugin符号,该符号将由dlsym.

因此,核心的注册OMX是:OMXMasterinvokes addVendorPluginwhich internal invokes addPlugin("libstagefrighthw.so")。在addPlugin中,将使用初始化 等的createOMXPlugin其他函数指针来查找。makeComponentInstancedestroyComponentInstance

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

通过这些更改,您的视频解码器将集成到 android stagefright 框架中。

于 2013-03-11T16:28:04.670 回答