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 }
View Code

 

 

创建安全的解码器(Creating secure decoders)

  在Android 4.4(KITKAT_WATCH)及之前版本,安全的编解码器没有被列在MediaCodecList中,但是仍然可以在系统中使用。安全编解码器只能够通过名字进行实例化,其名字是在常规编解码器的名字后附加.secure标识(所有安全编解码器的名字都必须以.secure结尾),调用createByCodecName(String)方法创建安全编解码器时,如果系统中不存在指定名字的编解码器就会抛出IOException异常。

  从Android 5.0(LOLLIPOP)及之后版本,你可以在media format中使用FEATURE_SecurePlayback属性来创建一个安全编解码器。

 

posted on 2016-07-11 16:36  二的次方  阅读(3686)  评论(1编辑  收藏  举报