MediaCodec

官网链接:https://developer.android.google.cn/reference/android/media/MediaCodec?hl=en

概述

MediaCodec类提供了低层次封装的多媒体编解码功能,也就是编码和解码组件。MediaCodec是Android低级别支持多媒体的基础组件,通常和MediaExtractor、MediaSync、MediaMuxer、MediaCrypto、MediaDrm、Image、Surface、AudioTrack一起使用。
在这里插入图片描述
宽泛的讲,一个编解码进程处理input数据,生成output数据,处理数据中使用一组input、out缓存buffer且为异步处理方式。一个简单的应用模型:请求或者接收一个空的input buffer,buffer中填数据后送到编解码器,编解码器处理input buffer中的数据,使用一个空的output buffer传递产生的数据。最终,请求或者收到一个装了数据的output buffer,消费掉output buffer中的数据或者直接释放output buffer。

数据类型

编解码器可以处理三种数据类型:压缩了的数据、裸audio数据、裸video数据。三种数据类型都可以使用Bytebuffer处理,但是对于裸video数据,使用Surface,可以提高编解码器性能。Surface使用本地video buffer,没有映射或者拷贝数据到ByteBuffers,因此更高效。正常情况下,使用Surface无法获取到裸video数据,但是可以使用ImageReader类获取非有保证的裸视频帧数据,这种方式依然比使用ByteBuffer高效,即使本地buffer映射到DirectByteBuffer。当使用ByteBuffer模式,可以通过Image类的getInput、OutputImage(int)获取裸视频帧数据。

压缩数据buffers

Input buffers(解码器使用)和Output buffers(编码器使用)根据MediaFormat#KEY_MIME缓存压缩数据。对于video类型数据,每次缓存一帧压缩video数据。对于audio类型数据,缓存一个可使用的单元(一个编码audio片段,根据格式类型决定包含几毫秒的audio数据),但是这种需求些微宽松些,可包含多个可使用的audio数据单元。如论什么形式,缓存数据不可能开始或者结束在任意字节边界,而是在帧或者可使用单元边界上,除非使用BUFFER_FLAG_PARTIAL_FRAME标记。

裸Audio buffers

裸audio buffers包含完整的PCM audio帧数据,帧数据是按照通道顺序的一个通道的采样数据。每一个PCM采样数据是一个按照本地字节序存储的16位有符号整形或者一个浮点数。裸Audio buffers是浮点数编码的情况,仅仅是在通过MediaCodec configure(…)设置MediaFormat#KEY_PCM_ENCODING为 AudioFormat#ENCODING_PCM_FLOAT,且在解码情况下通过getOutputFormat()确认,在编码情况下通过getInputFormat()确认。判断一个采样数据是浮点型,可以使用如下方法:

static boolean isPcmFloat(MediaFormat format) {
  return format.getInteger(MediaFormat.KEY_PCM_ENCODING, AudioFormat.ENCODING_PCM_16BIT)
      == AudioFormat.ENCODING_PCM_FLOAT;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值