美文网首页
MediaCodec

MediaCodec

作者: 34sir | 来源:发表于2024-07-25 13:13 被阅读0次

音视频编解码器 允许编码(压缩)和解码(解压)
实现播放 录制 转码

创建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();

相关文章

网友评论

      本文标题:MediaCodec

      本文链接:https://www.haomeiwen.com/subject/oqzvfjtx.html