在這篇文章中,我以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