音視頻編解碼器 允許編碼(壓縮)和解碼(解壓)
實(shí)現(xiàn)播放 錄制 轉(zhuǎn)碼
創(chuàng)建MediaCodec
MediaCodec codec = MediaCodec.createEncoderByType("video/avc");
配置MediaCodec
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height); // 設(shè)置寬高
format.setInteger(MediaFormat.KEY_BIT_RATE, 500000); // 設(shè)置碼率
format.setInteger(MediaFormat.KEY_FRAME_RATE, 15); // 設(shè)置幀率
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 60); // 設(shè)置關(guān)鍵幀間隔
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible); // 設(shè)置顏色格式
format.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR); // 設(shè)置碼率控制模式
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline); // 設(shè)置profile
format.setInteger(MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel31); // 設(shè)置level
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
處理輸入數(shù)據(jù)
int inputBufferIndex = codec.dequeueInputBuffer(timeout); //向編碼器輸入原始數(shù)據(jù)
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
inputBuffer.put(data);
codec.queueInputBuffer(inputBufferIndex, 0, data.length, presentationTimeUs, 0);
}
處理輸出數(shù)據(jù)
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, timeout); //獲取編碼后數(shù)據(jù)
if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
// 處理編碼后的數(shù)據(jù)
codec.releaseOutputBuffer(outputBufferIndex, false);
}
銷毀編碼器
codec.stop();
codec.release();