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

Zax*_*Zax 7 android android-ndk android-framework stagefright android-mediaplayer

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

Gan*_*esh 16

在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" />
Run Code Online (Sandbox Code Playgroud)

哪里,

一个.OMX.ABC.XYZ.H264.Decoder是组件的名称

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

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

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

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

2. OMX核心注册

要创建组件并确保调用正确的工厂方法,您可能必须OMXStagefright框架中注册Core .

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

因此,OMX核心的注册是:OMXMaster调用addVendorPlugin内部调用的内容addPlugin("libstagefrighthw.so").在addPlugin中,createOMXPlugin将使用这对于其他函数指针进行查找makeComponentInstance,destroyComponentInstance等被初始化.

一旦OMX核心被初始化,您就可以在Android框架内运行自己的组件.参考资料OMXMaster可以在这里找到.

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