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

Posted

技术标签:

【中文标题】Android:如何将解码器集成到多媒体框架【英文标题】:Android: How to integrate a decoder to multimedia framework 【发布时间】:2013-02-26 09:20:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

在 Android SF 框架中,编解码器通过media_codecs.xml 注册。在标准的 android 发行版中,可以在 here 找到一个示例 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.接下来的 2 个语句表示您的组件的 quirks特殊要求。在给定的示例中,requires-allocate-on-input-portsStagefright 框架表明组件更愿意在其所有输入端口上分配缓冲区。同样,另一个quirk 通知该组件也将更愿意在其输出端口上进行分配。系统支持的quirks列表可以参考OMXCodec.cpp文件中的函数OMXCodec::getComponentQuirks。这些怪癖转化为标志,然后由框架读取以创建和初始化组件。

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

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

2。 OMX 核心注册

要创建您的组件并确保调用正确的工厂方法,您可能必须将您的OMX Core 注册到Stagefright 框架。 p>

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

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

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

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

【讨论】:

非常感谢您的回复。但是我有点困惑。 假设我有一个项目,其中有一个文件资源管理器来选择要解码的输入文件和一个解码按钮来解码输入文件。我该如何进行上述步骤?等待你的答复。提前致谢。 @Zax 我已经在另一个线程上回答了这个问题***.com/questions/15356629/… 非常感谢您的帮助。 @Steve.. 最初您可以构建libstagefrighthw.so 并替换/system/lib 中的库。替换库后,您需要重新启动mediaserver 和瞧!...您的更改应该可以正常工作。从下一个整体构建开始,这些更改将自动成为构建系统的一部分,system.img 不需要代表您执行任何额外步骤。希望这会有所帮助。

以上是关于Android:如何将解码器集成到多媒体框架的主要内容,如果未能解决你的问题,请参考以下文章

集成Vitamio实现万能播放器

“Android 支持的媒体(编码器)格式”现在包括 AAC 和 AMR-WB,但我们如何使用它们呢?

整体看看Android的多媒体系统(多图)

Android MediaCodec硬件解码视频播放

手机影音第十二天,集成vitamio万能播放器

一起学Android之音频视频