Медиакодек Android декодирует данные на поверхность и сохраняет в mp4Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Медиакодек Android декодирует данные на поверхность и сохраняет в mp4

Сообщение Anonymous »

Поток байтов передается мне в реальном времени из внешнего источника через веб-сокет
  • Я использую привязку кодировщика к новой поверхности
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);
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»