音视频编解码器 允许编码(压缩)和解码(解压)
实现播放 录制 转码
创建MediaCodec
MediaCodec codec = MediaCodec.createEncoderByType("video/avc");
配置MediaCodec
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height); // 设置宽高
format.setInteger(MediaFormat.KEY_BIT_RATE, 500000); // 设置码率
format.setInteger(MediaFormat.KEY_FRAME_RATE, 15); // 设置帧率
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 60); // 设置关键帧间隔
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible); // 设置颜色格式
format.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR); // 设置码率控制模式
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline); // 设置profile
format.setInteger(MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel31); // 设置level
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
处理输入数据
int inputBufferIndex = codec.dequeueInputBuffer(timeout); //向编码器输入原始数据
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
inputBuffer.put(data);
codec.queueInputBuffer(inputBufferIndex, 0, data.length, presentationTimeUs, 0);
}
处理输出数据
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, timeout); //获取编码后数据
if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
// 处理编码后的数据
codec.releaseOutputBuffer(outputBufferIndex, false);
}
销毁编码器
codec.stop();
codec.release();