- Я использую привязку кодировщика к новой поверхности
- привязать декодирование к поверхности
mediaCodecDecoder.configure(format, encodeSurface , null, 0);
mediaCodecDecoder.start();
- когда я получил данные byte[], используйте декодирование медиакодеком
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);
}
- Тогда я могу напрямую получить данные из буфера кодирования
int outputBufferIndex = mediaCodecEncoder.dequeueOutputBuffer(encodeBufferInfo, 10_000);
ByteBuffer encodedData = mediaCodecEncoder.getOutputBuffer(outputBufferIndex);
encodedData.position(encodeBufferInfo.offset);
encodedData.limit(encodeBufferInfo.offset + encodeBufferInfo.size);
encodeBufferInfo.presentationTimeUs = encodeBufferInfo.presentationTimeUs * 1000;
mediaMuxer.writeSampleData(trackIndex, encodedData, encodeBufferInfo);
mediaCodecEncoder.releaseOutputBuffer(outputBufferIndex, false);
Наконец, я получил файл mp4, но шаги были громоздкими и требовали декодирования перед кодированием.
Как напрямую использовать необработанные потоковые данные и медиамуксер для получения MP4
Пробовал использовать, но этот код не работает, в MP4 не записано ни одного кадра данных
byte[]data;
if (!muxerStarted) {
MediaFormat videoFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_HEVC, width, height);
videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, 1000_000);
videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
trackIndex = mediaMuxer.addTrack(videoFormat);
mediaMuxer.start();
muxerStarted = true;
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
bufferInfo.offset = 0;
bufferInfo.presentationTimeUs = System.currentTimeMillis();
bufferInfo.flags = frameType;
bufferInfo.size = data.length;
ByteBuffer encodeData = ByteBuffer.wrap(data);
mediaMuxer.writeSampleData(trackIndex, encodeData, bufferInfo);
Подробнее здесь: https://stackoverflow.com/questions/791 ... ave-to-mp4