在这篇文章中,我以H.264
为例,但解决方案(s)可以扩展以支持其他编解码器,如MPEG-4
,VC-1
,VP8
等。有两种可能的解决方案来解决您的问题,我在下面列出,每个都有自己的优点和缺点,以帮助您做出明智的决定。
解决方案1:扩展编解码器,以支持新的模式
在JellyBean
,人们可以作为2点不同的部件的名称即,OMX.ABC.XYZ
和OMX.ABC.XYZ.secure
与相同类型MIME
注册相同OMX
部件。前者用于正常播放,是更常用的组件。当解析器即MediaExtractor
指示存在安全内容时使用后者。在OMXCodec::Create
中,在findMatchingCodecs
返回编解码器列表之后,我们可以观察选择.secure
组件作为here的选择。
遵循的步骤:
在你的平台上,有了一些新的扩展像OMX.H264.DECODER.decrypt
或类似的注册另一个组件。仅在media_codecs.xml
中需要更改。选择是注册新工厂方法还是采用通用工厂方法是您的选择。
从您的解析器中,当您遇到特定用例时,请设置一个新标志,如kKeyDecryptionRequired
。为此,您必须在中定义一个新的标志,并在OMXCodec.h
中定义一个相应的标志。
修改OMXCodec::create
方法以追加.decrypt
后缀,类似于.secure
后缀,如上所示。
随着OMXCodec
,Metadata
,MediaExtractor
模块的所有变化,你将只有libstagefright.so
重建和更换相同的平台上。
Voila !!你的整合应该是完整的。现在是组件内部的主要挑战。作为组件实现的一部分,您应该能够区分普通组件创建和组件创建。
从运行的角度看,假设你的组件是知道的事实,这是一个.decrypt
组件或没有,你可以处理decryption
为OMX_EmptyThisBuffer
电话,在那里你可以对数据进行解密,然后将它传递给一部分底层编解码器。
优点:易于集成,Android框架中的最小变化,可扩展到其他编解码器,没有新的需要MIME
类型注册。
缺点:您需要跟踪android的未来版本,特别是新的怪癖,旗帜和.decrypt
扩展的选择。如果谷歌决定采用类似的东西,你将不得不相应地修改/修改你的解决方案。
解决方案2:新的MIME类型
登记从你的问题,目前尚不清楚,如果你能定义MIME
型与否,因此,我捕捉为了清晰的步骤。
遵循的步骤:
在MediaDefs
注册新MIME
类型,如图here。例如,你可以使用一个新的MIME
类型const char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";
与media_codecs.xml
此更新MIME
类型注册新组件。请注意,您必须确保相应地处理组件怪癖。
在OMXCodec::setVideoOutputFormat
方法实现,你将不得不引进了如图所示的H.264
here处理新MIME
类型的支持。请注意,您将不得不在OMXCodec
中处理类似的更改以支持新的MIME
类型。
在MediaExtractor
中,您将不得不使用新定义的类型来为video
音轨发出MIME
类型的信号。通过这些更改,您的组件将被选中并创建。
然而,挑战依然存在:凡执行解密?为此,您可以采用与前一节中所述相同的解决方案,即与OMX_EmptyThisBuffer
调用的一部分相同。
优点:没有,我能想到的..
缺点:首先,解决方法是不可扩展的。您将不得不不断添加更新的MIME
类型并不断修改Stagefright
框架。接下来,OMXCodec
中的更改将需要MediaExtractor
的相应更改。因此,即使您最初的注意力集中在MP4
提取器上,如果您希望将解决方案扩展到其他容器格式,如AVI
,MKV
,您将不得不在这些提取器中包含对新MIME
类型的支持。
最后,一些注意事项。
作为首选的解决方案,我会推荐解决方案1,因为它很容易和简单。
我还没有谈及基于ACodec
的编解码器的实现。但是,我确实认为解决方案1将是一种更简单的解决方案,即使未来需要这种支持也是如此。
如果您未修改OMX
核心,则不应要求修改libstagefrighthw.so
。仅供参考,这通常由供应商实施,作为供应商特定模块的一部分,如vendor/<xyz>/hardware/...
。您需要与您的平台提供商联系libstagefrighthw.so
的来源。
非常感谢Ganesh,这太棒了。由于时间限制,我们现在不得不实施自定义媒体播放器,但很快就会返回到解决方案1 ......再次感谢。 – Matthew
@Mthethew我在紧张的时间表上完全按照相同的要求工作。解码前必须解密文件。你选择了哪一名球员?请给我一个建议。谢谢 – CodeFury
@Sree最后我放弃了现在修改Android。我基于这个例子的自定义播放器:[Cedric Fung](https://github.com/vecio/MediaCodecDemo)。在'int sampleSize = extractor.readSampleData(buffer,0)'行之后''你可以解密缓冲区。 (我已经构建了一个简单的加密器来加密样本数据并创建一个enc影片文件 - 只需要解析这些框并在加密数据后重新编码长度)。希望有所帮助! – Matthew