在 Android
开发中提供了实现音视频编解码工具 MediaCodec
,针对对应音视频解码类型通过该类创建对应解码器就能实现对数据进行解码操作
MediaCodec
所支持的数据类型: 压缩的音视频数据、原始音频数据和原始视频数据;首先 show 代码,紧接着之前 MediaExtactor
提取资源, MediaCodecList
遍历支持格式,确认设置支持该资源格式后通过 MediaCodec
创建解码器(这里是做视频解码播放)
在整个编解码过程中, MediaCodec 的使用会经历配置、启动、数据处理、停止、释放几个过程,相应的状态可归纳为停止(Stopped),执行(Executing)以及释放(Released)三个状态,而Stopped状态又可细分为未初始化(Uninitialized)、配置(Configured)、异常( Error),Executing状态也可细分为读写数据(Flushed)、运行(Running)和流结束(End-of-Stream)
MediaCodec 整个状态结构图如下:
从上图可知,当 MediaCodec 被创建后会进入未初始化状态,待设置好配置信息并调用 start() 启动后, MediaCodec 会进入运行状态,并且可进行数据读写操作
如果在这个过程中出现了错误,MediaCodec 会进入 Stopped 状态,我们就是要使用 reset 方法来重置编解码器,否则 MediaCodec 所持有的资源最终会被释放
当然,如果 MediaCodec 正常使用完毕,我们也可以向编解码器发送 EOS 指令,同时调用 stop 和 release 方法终止编解码器的使用
MediaCodec API 说明MediaCodec可以处理具体的视频流,主要有这几个方法:
- getInputBuffers:获取需要编码数据的输入流队列,返回的是一个ByteBuffer数组
- queueInputBuffer:输入流入队列
- dequeueInputBuffer:从输入流队列中取数据进行编码操作
- getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个ByteBuffer数组
- dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
- releaseOutputBuffer:处理完成,释放ByteBuffer数据
所有的同步模式的 MediaCodec API都遵循一个模式:
- 创建并配置一个 MediaCodec 对象
- 循环直到完成
- 如果输入缓冲区就绪,读取一个输入块,并复制到输入缓冲区中
- 如果输出缓冲区就绪,复制输出缓冲区的数据 释放 MediaCodec 对象
MediaCodec 主要提供了 createEncoderByType(String type)、createDecoderByType(String type) 两个方法来创建编解码器,它们均需要传入一个MIME类型多媒体格式
常见的MIME类型多媒体格式如下:
● “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/mp4v-es” - MPEG4 video ● “video/3gpp” - H.263 video ● “audio/3gpp” - AMR narrowband audio ● “audio/amr-wb” - AMR wideband audio ● “audio/mpeg” - MPEG1/2 audio layer III ● “audio/mp4a-latm” - AAC audio (note, this is raw AAC packets, not packaged in LATM!) ● “audio/vorbis” - vorbis audio ● “audio/g711-alaw” - G.711 alaw audio ● “audio/g711-mlaw” - G.711 ulaw audio
当然,MediaCodec 还提供了一个 createByCodecName (String name) 方法,支持使用组件的具体名称来创建编解码器;但是该方法使用起来有些麻烦,且官方是建议最好是配合 MediaCodecList 使用,因为 MediaCodecList 记录了所有可用的编解码器
当然,我们也可以使用该类对传入的 minmeType 参数进行判断,以匹配出 MediaCodec 对该mineType 类型的编解码器是否支持
以指定MIME类型为 “video/avc” 为例,代码如下:
private static MediaCodecInfo selectCodec(String mimeType) {
// 获取所有支持编解码器数量
int numCodecs = MediaCodecList.getCodecCount();
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?