Android MediaCodec 的实例化方法
*由于作者水平限制,文中难免有错误和不恰当之处,望批评指正。
*转载请注明出处:http://www.cnblogs.com/roger-yu/
=====================================================================================================
Android MediaCodec系列文章:
(一)Android多媒体--MediaCodec 中文API文档
(二)Android MediaCodec 的实例化方法
(三)Android MediaCodec 状态(States)转换分析
(四)Android MediaCodec的数据处理方式分析
=====================================================================================================
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属性来创建一个安全编解码器。