您当前的位置: 首页 >  音视频

Android技术栈

暂无认证

  • 1浏览

    0关注

    111博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

实现音视频编解码工具 MediaCodec 创建解码器

Android技术栈 发布时间:2022-08-30 17:12:34 ,浏览量:1

前言

Android 开发中提供了实现音视频编解码工具 MediaCodec,针对对应音视频解码类型通过该类创建对应解码器就能实现对数据进行解码操作

MediaCodec

MediaCodec 所支持的数据类型: 压缩的音视频数据、原始音频数据和原始视频数据;首先 show 代码,紧接着之前 MediaExtactor 提取资源, MediaCodecList 遍历支持格式,确认设置支持该资源格式后通过 MediaCodec 创建解码器(这里是做视频解码播放)

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 对象
(1) 创建编/解码器

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             
关注
打赏
1665219970
查看更多评论
0.0432s