Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何将解码器集成到多媒体框架中_Android_Android Ndk_Android Mediaplayer_Android Framework_Stagefright - Fatal编程技术网

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

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

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

在Android SF框架中,编解码器通过
media\u codecs.xml
注册。在标准android发行版中,可以找到一个示例
media\u codecs.xml
。所有视听组件都注册为
OMX
组件

1。编解码器注册

要注册视频解码器,您必须在
列表下添加一个新条目。为确保始终拾取编解码器,请确保将编解码器列为特定
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、 接下来的两条语句表示组件的
怪癖
特殊要求。在给定的示例中,
要求在输入端口上分配
Stagefright
框架指示组件更愿意在其所有输入端口上分配缓冲区。类似地,另一个
怪癖是通知组件也希望在其输出端口上进行分配。有关系统中支持的
quirks
列表,可以参考文件中的函数
OMXCodec::getComponentQuirks
。这些怪癖转化为标志,然后框架读取这些标志来创建和初始化组件

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

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

2。OMX核心注册

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

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

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

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


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

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