Android:如何将解码器集成到多媒体框架
最近我已经成功地将video解码器移植到android。 还将输出转储到surfaceview并使用本地API检查输出。 接下来的任务是实现播放,暂停,stream媒体等,即媒体播放器的其他function。 这样做将是一个返工,因为所有这些function已经在android多媒体框架中定义。 我听说我们可以将我们的解码器作为一个插件,并将其整合到Android的多媒体框架中。 虽然我GOOGLE了同样的,我几乎找不到任何有关信息。 所以我恳请任何读者为上述问题build议一些相关链接或解决办法。 在此先感谢,等待您的答复。
在Android SF框架中,编解码器通过media_codecs.xml
进行注册。 在标准的android发行版中,可以在这里find一个例子media_codecs.xml
。 所有视听组件都被注册为OMX
组件。
1.编解码器注册
要注册您的video解码器,您必须在<Decoders>
列表下添加一个新条目。 为确保您的编解码器始终处于可用状态,请确保您的编解码器被列为特定MIME
types的第一个条目。 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/avc
是组件的MIME
types。 在这个例子中,它表示一个AVC / H.264video解码器。
c。接下来的两个语句表示组件的quirks
或特殊要求 。 在给定的示例中, Stagefright
requires-allocate-on-input-ports
指示Stagefright
框架,组件倾向于在所有input端口上分配缓冲区。 同样,另一个quirk
是通知组件也将喜欢分配它的输出端口。 有关系统支持的quirks
列表,可以参考OMXCodec.cpp文件中的OMXCodec::getComponentQuirks
函数。 这些怪癖翻译成标志,然后由框架读取以创build和初始化组件。
在示例图中,显示了您的OMX
组件在默认的 Google实现的video解码器之前注册。
注意 :如果您在terminal设备上尝试此操作,则必须确保此条目反映在最终的media_codecs.xml
文件中。
2. OMX核心注册
要创build组件并确保调用正确的工厂方法 ,您可能需要在Stagefright
框架中注册OMX
Core。
要注册一个新的内核,您将不得不创build一个名为libstagefrighthw.so
的新库,它位于您的最终系统的/system/lib
下。 这个库将不得不公开一个将被dlsym
查找的createOMXPlugin
符号。
OMX
核心的注册是这样的: OMXMaster
调用addVendorPlugin
,它在内部调用addPlugin("libstagefrighthw.so")
。 在addPlugin
,将createOMXPlugin
,使用它来初始化makeComponentInstance
, destroyComponentInstance
等的其他函数指针。
OMX
内核初始化后,就可以在android框架中运行自己的组件。 OMXMaster
可以在这里find。
随着这些变化,你的video解码器被集成到android stagefright框架中。