- Я использую привязку кодировщика к новой поверхности, но не знаю, как это сделать. чтобы получить буфер декодирования для кодирования
Код: Выделить всё
encodeSurface = encoder.createInputSurface();
- привязать декодирование к поверхности
Код: Выделить всё
mediaCodecDecoder = MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC);
mediaCodecDecoder.configure(format, encodeSurface , null, 0);
mediaCodecDecoder.start();
- когда я получил данные byte[], используйте декодирование медиакодеком
Код: Выделить всё
int index = mediaCodecDecoder.dequeueInputBuffer(10_000);
ByteBuffer byteBuffer = mediaCodecDecoder.getInputBuffer(index);
byteBuffer.put(data);
mediaCodecDecoder.queueInputBuffer(index, 0, data.length,System.currentTimeMillis(),0);
int encoderStatus = mediaCodecDecoder.dequeueOutputBuffer(this.decodeBufferInfo, 1_000);
if(encoderStatus>0){
mediaCodecDecoder.releaseOutputBuffer(encoderStatus, true);
}
- Тогда я могу напрямую получить данные из буфера кодирования
Код: Выделить всё
while(true){
int outputBufferIndex = mediaCodecEncoder.dequeueOutputBuffer(encodeBufferInfo, 10_000);
ByteBuffer encodedData = mediaCodecEncoder.getOutputBuffer(outputBufferIndex);
encodedData.position(encodeBufferInfo.offset);
encodedData.limit(encodeBufferInfo.offset + encodeBufferInfo.size);
if (videoFrameStart == 0 && encodeBufferInfo.presentationTimeUs != 0) {
videoFrameStart = encodeBufferInfo.presentationTimeUs;
}
encodeBufferInfo.presentationTimeUs -= videoFrameStart;
}
mediaMuxer.writeSampleData(trackIndex, encodedData, encodeBufferInfo);
mediaCodecEncoder.releaseOutputBuffer(outputBufferIndex, false);
Как получить правильный файл mp4
Подробнее здесь: https://stackoverflow.com/questions/791 ... ave-to-mp4