Mat*_*hew 5 android codec stagefright
我需要开发一个自定义的'包装'视频编解码器并将其集成到android(现在的JB,ICS以后).我们想要使用SIM中的一些自定义解密密钥(不要问!).最好的方法(允许它与其他非加密媒体一起工作并使用标准媒体播放器或其他)似乎是定义我们自己的mime类型,并将其链接到可以执行自定义的自定义包装编解码器解密,然后将数据传递给真正的编解码器.(我们.mp4现在说文件类型.)
(另一种选择可能是编写我们自己的媒体播放器,但我们宁愿不去那条路,因为我们真的希望媒体能够与其他媒体无缝地一起出现)
我一直在尝试遵循本指南: 如何将解码器集成到多媒体框架中
我在使用OMX Core注册时遇到了麻烦 - 我可以libstagefright.so通过键入来构建来自android源代码make stagefright但是在指南中他说要使用libstagefrighthw.so适合JB 的那个,但是我不知道如何构建它,它不会似乎是从使用中构建的,make stagefright除非我做错了什么?
另一个问题是即使我确实注册了自定义包装编解码器,我也不确定如何将数据传递给真正的编解码器.
如果有人有任何建议(或者可以给一些宝宝一步一步的指示!),我真的很感激 - 截止日期对于概念验证非常紧张,而且我对编解码器或媒体框架知之甚少......
非常感谢.(ps我不想进入关于drm和模拟孔等的泥泞斗争..,谢谢)
在这篇文章中,我使用H.264作为一个例子,但解决方案(S)可以扩展到支持其他的编解码器一样MPEG-4,VC-1,VP8等有2个可能的解决方案来解决你的问题,这我争取之下,每一个都有自己的优点并帮助您做出明智的决定.
解决方案1:扩展编解码器以支持新模式
在JellyBean,人们可以注册相同的OMX与相同的分量MIME类型作为2点不同的部件的名称即,OMX.ABC.XYZ和OMX.ABC.XYZ.secure.前者用于正常播放,是更常用的组件.当解析器MediaExtractor指示存在安全内容时使用后者.在OMXCodec::Create后findMatchingCodecs返回编解码器的列表,我们可以观察到的选择,选择.secure组件作为这里.
要遵循的步骤:
在您的平台中,使用一些新的扩展名OMX.H264.DECODER.decrypt或类似的东西注册另一个组件.仅在需要更改media_codecs.xml.您可以选择是注册新工厂方法还是使用通用工厂方法.
从您的解析器,当您遇到特定用例时,设置一个新的标志,如kKeyDecryptionRequired.为此,您必须在其中定义一个新标志Metadata.h和相应的怪癖OMXCodec.h.
修改OMXCodec::create方法以附加.decrypt类似于.secure后缀的后缀,如上所示.
在所有的变化OMXCodec,Metadata,MediaExtractor模块,你将只有重建libstagefright.so和更换相同的平台上.
瞧!你的整合应该是完整的.现在是组件内部的主要挑战.作为组件实现的一部分,您应该能够区分普通组件创建和.decrypt组件创建.
从运行时的角度来看,假设您的组件知道它是一个.decrypt组件的事实,您可以处理decryption作为OMX_EmptyThisBuffer调用的一部分,您可以在其中解密数据,然后将其传递给底层编解码器.
优点:易于集成,Android框架的最小变化,可扩展到其他编解码器,无需新的MIME类型注册.
缺点:你需要跟踪android的未来版本,特别是新的怪癖,标志和.decrypt扩展选择.如果Google决定使用类似的东西,则必须相应地调整/修改您的解决方案.
解决方案2:注册新的MIME类型
从您的问题来看,目前尚不清楚您是否能够定义MIME类型,因此,为了清晰起见,我正在捕捉这些步骤.
要遵循的步骤:
MIME在此处MediaDefs显示注册新类型.例如,您可以使用新类型MIMEconst char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";
使用此更新MIME类型注册新组件media_codecs.xml.请注意,您必须确保相应处理组件怪癖.
在OMXCodec::setVideoOutputFormat方法的实现,你将不得不推出用于处理你的新的支持MIME如图所示的类型H.264 这里.请注意,您必须处理类似的更改OMXCodec以支持新MIME类型.
在MediaExtractor,您必须使用新定义的类型发出轨道MIME类型的信号video.通过这些更改,将选择并创建组件.
但是,挑战仍然存在:在哪里执行解密?为此,您也可以使用与上一节中描述的相同的解决方案,即处理与OMX_EmptyThisBuffer呼叫的一部分相同的解决方案.
优点:没有我能想到的..
缺点:首先,解决方案不具备可扩展性.您将不得不继续添加更新的MIME类型并继续修改Stagefright框架.接下来,更改OMXCodec将需要相应的更改MediaExtractor.因此,即使您最初的重点是MP4提取,如果你想解决方案扩展到其他容器格式一样AVI,MKV你必须包括对新的支持,MIME在这些提取的类型.
最后,一些笔记.
作为首选解决方案,我会推荐解决方案1,因为它简单易行.
我没有涉及ACodec编解码器的基础实现.但是,我确实认为解决方案1将是一个更容易实现的解决方案,即使将来需要这样的支持.
如果您不修改OMX核心,则不应要求修改libstagefrighthw.so.仅供参考,这通常由供应商实施,作为其供应商特定模块的一部分,如vendor/<xyz>/hardware/....您需要向您的平台提供商查询源代码libstagefrighthw.so.
| 归档时间: |
|
| 查看次数: |
2029 次 |
| 最近记录: |