Android自带硬编解码器MediaCodec使用必看

一、背景

随着Android系统手机性能的不断提升,现阶段大部分手机都自带GPU(承担图形显示的专门硬件),大幅度提高手机显示性能,在视频显示、游戏画面刷新,和高分辨图像显示方面必须使用GPU。GOOGLE在API 16 -4.1版本中增加MediaCodec类,专用于编解码多媒体数据,

二、MediaCodec使用方式

     MediaCodec总共有三种使用方法,如下图所示:

          同步数据处理(使用buffer arrays) 从Android4.1 api 16即可以使用;

          同步数据处理 (使用buffers ) 从Android5.0 api 21 即可以使用;

          异步数据处理(使用buffers ) 从Android5.0 api 21 即可以使用;

同步与异步处理数据的主要不同点是:对于同步处理是循环的将待处理数据交给编解码器(不用理会编解码器是否已经准备好接收数据),而异步处理则是每次都会去等待编解码器已经能够处理数据时,才将待处理数据送给相应编解码器。

MediaCodec is typically used like this in asynchronous mode:

[java] view plain copy
  1. MediaCodec codec = MediaCodec.createByCodecName(name);  
  2.  MediaFormat mOutputFormat; // member variable  
  3.  codec.setCallback(new MediaCodec.Callback() {  
  4.    @Override  
  5.    void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {  
  6.      ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);  
  7.      // fill inputBuffer with valid data  
  8.      …  
  9.      codec.queueInputBuffer(inputBufferId, …);  
  10.    }  
  11.   
  12.    @Override  
  13.    void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, …) {  
  14.      ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);  
  15.      MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A  
  16.      // bufferFormat is equivalent to mOutputFormat  
  17.      // outputBuffer is ready to be processed or rendered.  
  18.      …  
  19.      codec.releaseOutputBuffer(outputBufferId, …);  
  20.    }  
  21.   
  22.    @Override  
  23.    void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {  
  24.      // Subsequent data will conform to new format.  
  25.      // Can ignore if using getOutputFormat(outputBufferId)  
  26.      mOutputFormat = format; // option B  
  27.    }  
  28.   
  29.    @Override  
  30.    void onError(…) {  
  31.      …  
  32.    }  
  33.  });  
  34.  codec.configure(format, …);  
  35.  mOutputFormat = codec.getOutputFormat(); // option B  
  36.  codec.start();  
  37.  // wait for processing to complete  
  38.  codec.stop();  
  39.  codec.release();  

Synchronous Processing using Buffers

[java] view plain copy
  1. MediaCodec codec = MediaCodec.createByCodecName(name);  
  2. codec.configure(format, …);  
  3. MediaFormat outputFormat = codec.getOutputFormat(); // option B  
  4. codec.start();  
  5. for (;;) {  
  6.   int inputBufferId = codec.dequeueInputBuffer(timeoutUs);  
  7.   if (inputBufferId >= 0) {  
  8.     ByteBuffer inputBuffer = codec.getInputBuffer(…);  
  9.     // fill inputBuffer with valid data  
  10.     …  
  11.     codec.queueInputBuffer(inputBufferId, …);  
  12.   }  
  13.   int outputBufferId = codec.dequeueOutputBuffer(…);  
  14.   if (outputBufferId >= 0) {  
  15.     ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);  
  16.     MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A  
  17.     // bufferFormat is identical to outputFormat  
  18.     // outputBuffer is ready to be processed or rendered.  
  19.     …  
  20.     codec.releaseOutputBuffer(outputBufferId, …);  
  21.   } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {  
  22.     // Subsequent data will conform to new format.  
  23.     // Can ignore if using getOutputFormat(outputBufferId)  
  24.     outputFormat = codec.getOutputFormat(); // option B  
  25.   }  
  26. }  
  27. codec.stop();  
  28. codec.release();  

三、MediaCodec能够硬编解码的类型



其中对于视频格式,MediaCodec支持的有vp8 、VP9 、H.264、H.265、MPEG4、H.263基本上涵盖了现今流行的所有视频格式,

对于音频来说,MediaCodec支持的音频格式有3gppamr-wb、amr-wb、amr-wb、g711-A、g711-U 、AAC(not packaged in LATM)

  • "video/x-vnd.on2.vp8" - VP8 video (i.e. video in .webm)
  • "video/x-vnd.on2.vp9" - VP9 video (i.e. video in .webm)
  • "video/avc" - H.264/AVC video
  • "video/hevc" - H.265/HEVC video
  • "video/mp4v-es" - MPEG4 video
  • "video/3gpp" - H.263 video


  • "audio/3gpp" - AMR narrowband audio
  • "audio/amr-wb" - AMR wideband audio
  • "audio/amr-wb" - MPEG1/2 audio layer III
  • "audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)
  • "audio/amr-wb" - vorbis audio
  • "audio/g711-alaw" - G.711 alaw audio
  • "audio/g711-mlaw" - G.711 ulaw audio

FormatSuitable key frame
VP9/VP8a suitable intraframe where no subsequent frames refer to frames prior to this frame.
(There is no specific name for such key frame.)
H.265 HEVCIDR or CRA
H.264 AVCIDR
MPEG-4
H.263
MPEG-2
a suitable I-frame where no subsequent frames refer to frames prior to this frame.
(There is no specific name for such key frame.)
转自:http://blog.csdn.net/guofengpu/article/details/51544454
阅读更多
换一批

没有更多推荐了,返回首页