getInpuBuffer в Android MediaCodec и MediaMuxer

Ниже приведен фрагмент примера кода Android MediaMuxer API: https://developer.android.com/reference/android/media/MediaMuxer.html

MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);
 // More often, the MediaFormat will be retrieved from MediaCodec.getOutputFormat()
 // or MediaExtractor.getTrackFormat().
 MediaFormat audioFormat = new MediaFormat(...);
 MediaFormat videoFormat = new MediaFormat(...);
 int audioTrackIndex = muxer.addTrack(audioFormat);
 int videoTrackIndex = muxer.addTrack(videoFormat);
 ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);
 boolean finished = false;
 BufferInfo bufferInfo = new BufferInfo();

 muxer.start();
 while(!finished) {
   // getInputBuffer() will fill the inputBuffer with one frame of encoded
   // sample from either MediaCodec or MediaExtractor, set isAudioSample to
   // true when the sample is audio data, set up all the fields of bufferInfo,
   // and return true if there are no more samples.
   finished = getInputBuffer(inputBuffer, isAudioSample, bufferInfo);
   if (!finished) {
     int currentTrackIndex = isAudioSample ? audioTrackIndex : videoTrackIndex;
     muxer.writeSampleData(currentTrackIndex, inputBuffer, bufferInfo);
   }
 };
 muxer.stop();
 muxer.release();

Для этой строки: finished = getInputBuffer(inputBuffer, isAudioSample, bufferInfo); Я не нашел эту функцию getInputBuffer ни в MediaCodec.java, ни в MediaMuxer.java, это определяемая пользователем функция или функция API?


person mewo1234    schedule 08.02.2017    source источник


Ответы (1)


В этом случае getInputBuffer является гипотетической определяемой пользователем функцией. Это не функция API. Комментарий выше объясняет, что он должен делать. (Обратите внимание, что на самом деле это не будет работать так, как написано, поскольку переменная isAudioSample также не может быть обновлена ​​функцией так, как она точно написана.)

person mstorsjo    schedule 08.02.2017
comment
Предположим, я хочу записывать видео (кодирование с поверхности) и аудио с помощью API MediaCodec и MediaMuxer. Должен ли я явно устанавливать временную метку для bufferInfo (как видео, так и аудио) или просто использовать значение по умолчанию? Возможно, какая-то платформа использует разные метки времени для поверхности и звука, например, время загрузки, монотонное время и т. д. - person mewo1234; 08.02.2017
comment
Я ожидаю, что временные метки из медиакодека будут работать нормально, при условии, что вы получили правильные входные временные метки для кодировщика. - person mstorsjo; 08.02.2017
comment
@ mewo1234 mewo1234 Вы должны установить метку времени вручную при использовании ввода Surface для MediaCodec, потому что вы не можете связать метку времени с кадром на входе MediaCodec с Surface. По моему опыту, невыполнение этого требования может привести к пропуску некоторых кадров. Это означает, что вам нужно установить информацию о буфере presentationTimeUs для буферов вывода из кодировщика. Вам не нужно беспокоиться о временных метках для аудио; единственное, что MediaCodec заботит о временных метках входного аудио, это то, что они строго увеличиваются. MediaCodec должен выводить правильные метки времени с закодированными аудиосэмплами. - person Grant; 10.02.2017