*由於作者水平限制,文中難免有錯誤和不恰當之處,望批評指正。
*轉載請注明出處:http://www.cnblogs.com/roger-yu/
MediaCodec的實例化方法主要有兩種:
1、使用方法createByCodecName(String)----根據特定的MediaFormat創建
這種方法使用的前提是你必須知道要實例化的codec的確切的名字。這種方法使用時,通常會利用MediaCodecList類來獲取相關的codec name信息。
例子:在對一個file進行解碼時,首先你可以調用MediaExtractor.getTrackFormat方法獲得期望的Format,如有需要可以調用MediaFormat.setFeatureEnabled方法添加新特性;然后調用MediaCodecList.findDecoderForFormat方法得到可以處理指定media format的codec的name;最后根據得到的codec name並調用createByCodecName(String)方法實例化需要的MediaCodec。
注意:在Android5.0系統上,使用MediaCodecList.findDecoder/EncoderForFormat方法時,參數MediaFormat中不能包含有frame rate的特性。可以使用format.setString(MediaFormat.KEY_FRAME_RATE, null)清除已存在的frame rate特性。
2、使用方法createDecoderByType(String)/createEncoderByType(String)---根據指定的MIME type創建
根據指定的MIME type來創建codec。
注意:使用這種方法創建的codec有可能不能處理期望media format的數據,所有最好使用第一種方法。
下面給出一個例子,當我們想創建一個 video decoder 時,可以采用如下方式實例化 MediaCodec:
1 MediaCodec decoder = null; 2 MediaExtractor extractor = new MediaExtractor(); 3 extractor.setDataSource(...); 4 int numTracks = extractor.getTrackCount(); 5 for (int i = 0; i < numTracks; ++i) { 6 MediaFormat format = extractor.getTrackFormat(i); 7 String mime = format.getString(MediaFormat.KEY_MIME); 8 if (mime.startsWith("video/")) { 9 10 // method-1 11 format.setFeatureEnabled(...); // Inject any specific features 12 MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS); 13 String decoderName = codecList.findDecoderForFormat(format); 14 decoder = MediaCodec.createByCodecName(decoderName); 15 ... 16 17 // method-2 18 decoder = MediaCodec.createDecoderByType(mime); 19 ... 20 } 21 }
創建安全的解碼器(Creating secure decoders)
在Android 4.4(KITKAT_WATCH)及之前版本,安全的編解碼器沒有被列在MediaCodecList中,但是仍然可以在系統中使用。安全編解碼器只能夠通過名字進行實例化,其名字是在常規編解碼器的名字后附加.secure標識(所有安全編解碼器的名字都必須以.secure結尾),調用createByCodecName(String)方法創建安全編解碼器時,如果系統中不存在指定名字的編解碼器就會拋出IOException異常。
從Android 5.0(LOLLIPOP)及之后版本,你可以在media format中使用FEATURE_SecurePlayback屬性來創建一個安全編解碼器。
微信掃一掃,關注玖零日記,獲取更多相關資訊及源碼 -- 雖無面朝大海,依舊春暖花開

