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

Format Suitable key frame
VP9/VP8 a suitable intraframe where no subsequent frames refer to frames prior to this frame.
(There is no specific name for such key frame.)
H.265 HEVC IDR or CRA
H.264 AVC IDR
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.)

你可能感兴趣的:(Android,多媒体)