MediaCodec

音視頻編解碼器 允許編碼(壓縮)和解碼(解壓)
實(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();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容