Android自带硬解码解码类型说明MediaCodec使用必看

原创 2016年05月31日 13:52:33

一、背景

随着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:

MediaCodec codec = MediaCodec.createByCodecName(name);
 MediaFormat mOutputFormat; // member variable
 codec.setCallback(new MediaCodec.Callback() {
   @Override
   void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
     ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
     // fill inputBuffer with valid data
     …
     codec.queueInputBuffer(inputBufferId, …);
   }

   @Override
   void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, …) {
     ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
     MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
     // bufferFormat is equivalent to mOutputFormat
     // outputBuffer is ready to be processed or rendered.
     …
     codec.releaseOutputBuffer(outputBufferId, …);
   }

   @Override
   void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
     // Subsequent data will conform to new format.
     // Can ignore if using getOutputFormat(outputBufferId)
     mOutputFormat = format; // option B
   }

   @Override
   void onError(…) {
     …
   }
 });
 codec.configure(format, …);
 mOutputFormat = codec.getOutputFormat(); // option B
 codec.start();
 // wait for processing to complete
 codec.stop();
 codec.release();

Synchronous Processing using Buffers

 MediaCodec codec = MediaCodec.createByCodecName(name);
 codec.configure(format, …);
 MediaFormat outputFormat = codec.getOutputFormat(); // option B
 codec.start();
 for (;;) {
   int inputBufferId = codec.dequeueInputBuffer(timeoutUs);
   if (inputBufferId >= 0) {
     ByteBuffer inputBuffer = codec.getInputBuffer(…);
     // fill inputBuffer with valid data
     …
     codec.queueInputBuffer(inputBufferId, …);
   }
   int outputBufferId = codec.dequeueOutputBuffer(…);
   if (outputBufferId >= 0) {
     ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
     MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
     // bufferFormat is identical to outputFormat
     // outputBuffer is ready to be processed or rendered.
     …
     codec.releaseOutputBuffer(outputBufferId, …);
   } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
     // Subsequent data will conform to new format.
     // Can ignore if using getOutputFormat(outputBufferId)
     outputFormat = codec.getOutputFormat(); // option B
   }
 }
 codec.stop();
 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.)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ffprobe命令参数学习总结

1、NAME        ffprobe - ffprobe media prober 2、SYNOPSIS        ffprobe [options] [input_file] 3、DE...

C++全局变量在多个源代码文件中的使用

在比较大的项目中,如果需要使用全局变量,那么就需要注意一些全局变量声明、使用不当引起的问题了。 本篇文章主要内容有两个:普通全局变量、静态全局变量、全局常量。 1、普通全局变量:假设我们需要在多个不同...

Android自带硬解码解码类型说明MediaCodec使用必看

一、背景 随着Android系统手机性能的不断提升,现阶段大部分手机都自带GPU(承担图形显示的专门硬件),大幅度提高手机显示性能,在视频显示、游戏画面刷新,和高分辨图像显示方面必须使用GPU。...

Android使用MediaCodec硬解码播放H264格式视频文件

前些时间,通过各种搜索加请教了好几个同行的朋友,在他们的指点下实现: RTSP+H264实时视频播放播放及把实时视频流保存到手机SD卡中,再对保存的H264格式文件进行播放等基本功能。 非常感...
  • true100
  • true100
  • 2017年01月03日 11:36
  • 10088

Android MediaCodec 硬解码H264

  • 2017年11月21日 12:34
  • 2.05MB
  • 下载

Android 用MediaCodec实现视频硬解码

本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码。例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示。我将尽量讲得简短而清晰,不展示那些不相关...

Android MediaCodec硬解码AAC音频文件(实时AAC音频帧)并播放

利用android MediaCodec解码AAC音频文件或者实时AAC音频帧并通过AudioTrack来播放

Android MediaCodec硬解码AAC音频文件并播放

在这里简单介绍一下,如何利用Android MediaCodec解码AAC音频文件或者实时AAC音频帧并通过AudioTrack来播放。主要的思路就是从文件或者网络获取一帧帧的AAC的数据,送入解码器...

Android 用MediaCodec实现视频硬解码

转自:http://blog.csdn.net/mirkerson/article/details/37694719 http://blog.csdn.net/halleyzhang...

Android MediaCodec硬解码H264文件

利用MediaCodec解码H264文件之后利用SurfaceView进行显示
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android自带硬解码解码类型说明MediaCodec使用必看
举报原因:
原因补充:

(最多只允许输入30个字)