Ниже приведен фрагмент Android MediaMuxer образец кода API: https://developer.android.com/reference/android/media/MediaMuxer.htmlgetInpuBuffer в Android MediaCodec и MediaMuxer
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?
Предположим, что я хочу записывать видео (кодирование из поверхность) и аудио с использованием MediaCodec и MediaMuxer API, должен ли я установить временную метку для bufferInfo (как видео, так и аудио) явно или просто использовать значение по умолчанию? Возможно, на какой-то платформе используются разные временные метки для поверхности и звука, такие как время загрузки и монотонное время и т. Д. – mewo1234
Я ожидал бы, что метки времени от mediacodec должны работать нормально, предполагая, что вы получили правильные временные метки ввода для кодировщика. – mstorsjo
@ mewo1234 Вы должны установить временную метку вручную при использовании ввода поверхности в MediaCodec, потому что вы не можете связать временную метку с фреймом на входе MediaCodec с поверхности. По моему опыту, неспособность сделать это может привести к некоторым пропущенным кадрам. Это означает, что вам нужно установить буферную информацию 'presentationTimeUs' для выходных буферов из кодировщика. Вам не нужно беспокоиться о временных отметках для звука; единственное, что MediaCodec заботится о входных звуковых методах, заключается в том, что они строго растут. MediaCodec должен выводить правильные временные метки с помощью закодированных образцов звука. – nyttimangus