5

我需要开发一个自定义的“包装器”视频编解码器并将其集成到 android(现在是 JB,稍后是 ICS)中。我们想使用来自 SIM 卡的一些自定义解密密钥(不要问!)。最好的方法(允许它与其他非加密媒体一起工作并使用标准媒体播放器或其他)似乎是定义我们自己的 mime 类型,并将其链接到可以执行自定义的自定义包装编解码器解密,然后将数据传递给真正的编解码器。(假设文件类型是.mp4现在。)

(另一种方法可能是编写我们自己的媒体播放器,但我们宁愿不走那条路,因为我们真的希望媒体与其他媒体一起无缝出现)

我一直在尝试遵循本指南: 如何将解码器集成到多媒体框架中

  1. 我在注册 OMX Core 时遇到问题 - 我可以libstagefright.so通过键入从 android 源代码构建,make stagefright但在指南中他说使用libstagefrighthw.so似乎适合 JB 的,但我不确定如何构建它,它不似乎是从使用中构建的,make stagefright除非我做错了什么?

  2. 另一个问题是,即使我注册了自定义包装编解码器,我也不确定如何将数据传递给真正的编解码器。

如果有人有任何建议(或者可以给一些婴儿一步一步的指导!),我真的很感激 - 概念证明的截止日期非常紧迫,我对编解码器或媒体框架知之甚少......

非常感谢。(ps 我不想卷入一场关于 drm 和模拟孔等的泥战,谢谢)

4

1 回答 1

9

在这篇文章中,我H.264以示例为例,但可以扩展解决方案以支持其他编解码器,如,MPEG-4等。有两种可能的解决方案可以解决您的问题,我在下面列出了这些解决方案,每个都有自己的优点和缺点,以帮助您做出明智的决定。VC-1VP8

解决方案 1:扩展编解码器以支持新模式

JellyBean中,可以将OMX具有相同类型的相同组件注册MIME为 2 个不同的组件名称,即OMX.ABC.XYZOMX.ABC.XYZ.secure。前者用于正常播放,是比较常用的组件。后者在解析器 ieMediaExtractor指示存在安全内容时使用。在OMXCodec::CreatefindMatchingCodecs返回编解码器列表后,我们可以观察到选择.secure组件的选择,如下所示

要遵循的步骤:

  1. 在您的平台中,使用一些新的扩展名或类似的东西注册另一个组件OMX.H264.DECODER.decrypt。仅在 中需要更改media_codecs.xml。是注册一个新的工厂方法还是拥有一个通用的工厂方法是你的选择。

  2. 在您的解析器中,当您遇到特定用例时,设置一个新标志,例如kKeyDecryptionRequired. 为此,您必须在 中定义一个新标志Metadata.h和一个相应的怪癖OMXCodec.h

  3. 修改OMXCodec::create方法,追加与上图.decrypt类似的.secure后缀。

  4. 随着OMXCodec, Metadata,MediaExtractor模块中的所有更改,您只需重建libstagefright.so并在您的平台上替换相同的内容。

瞧!!您的集成应该是完整的。现在是组件内部的主要挑战。作为组件实现的一部分,您应该能够区分普通组件创建和.decrypt组件创建。

从运行时的角度来看,假设您的组件知道它是否是一个.decrypt组件,您可以将其decryption作为OMX_EmptyThisBuffer调用的一部分进行处理,您可以在其中解密数据,然后将其传递给底层编解码器。

优点:易于集成,Android 框架的变化最小,可扩展到其他编解码器,不需要新的MIME类型注册。

缺点:您需要跟踪 android 的未来版本,特别是新的怪癖、标志和.decrypt扩展选择。如果 Google 决定采用类似的方法,您将不得不相应地调整/修改您的解决方案。

解决方案 2:注册新的 MIME 类型

从您的问题来看,尚不清楚您是否能够定义MIME类型,因此,为了清楚起见,我正在捕获这些步骤。

要遵循的步骤:

  1. 此处注册一个新MIME类型。例如,您可以使用一种新类型作为MediaDefsMIMEconst char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";

  2. MIMEmedia_codecs.xml. _ 请注意,您必须确保相应地处理组件怪癖。

  3. OMXCodec::setVideoOutputFormat方法实现中,您必须引入对处理新类型的支持,如此MIME所示。请注意,您必须处理类似的更改才能支持新类型。H.264 OMXCodecMIME

  4. MediaExtractor中,您必须使用新定义的类型来指示轨道的类型MIMEvideo通过这些更改,您的组件将被选中并创建。

然而,挑战仍然存在:在哪里执行解密?为此,您也可以采用与上一节中描述的相同的解决方案,即处理与OMX_EmptyThisBuffer调用的一部分相同的方法。

优点:没有我能想到的..

缺点:首先,解决方案不可扩展。您将不得不不断添加更新MIME的类型并不断修改Stagefright框架。接下来, 中的更改OMXCodec将需要 中的相应更改MediaExtractor。因此,即使您最初的重点是MP4提取器,如果您希望将解决方案扩展到其他容器格式,例如AVI, ,您将必须在这些提取器MKV中包含对新类型的支持。MIME

最后,一些笔记。

  1. 作为首选解决方案,我会推荐解决方案 1,因为它简单易行。

  2. 我还没有触及ACodec编解码器的基于实现。但是,我确实认为解决方案 1 将是一个更容易实施的解决方案,即使将来需要这样的支持。

  3. 如果您不修改OMX核心,则不需要修改libstagefrighthw.so. 仅供参考,这通常由供应商实施,作为其供应商特定模块的一部分,如vendor/<xyz>/hardware/.... 您需要与您的平台提供商核实libstagefrighthw.so.

于 2013-04-23T00:32:55.630 回答