2017-02-08 13 views
1

Ниже приведен фрагмент 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?

ответ

0

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

+0

Предположим, что я хочу записывать видео (кодирование из поверхность) и аудио с использованием MediaCodec и MediaMuxer API, должен ли я установить временную метку для bufferInfo (как видео, так и аудио) явно или просто использовать значение по умолчанию? Возможно, на какой-то платформе используются разные временные метки для поверхности и звука, такие как время загрузки и монотонное время и т. Д. – mewo1234

+0

Я ожидал бы, что метки времени от mediacodec должны работать нормально, предполагая, что вы получили правильные временные метки ввода для кодировщика. – mstorsjo

+0

@ mewo1234 Вы должны установить временную метку вручную при использовании ввода поверхности в MediaCodec, потому что вы не можете связать временную метку с фреймом на входе MediaCodec с поверхности. По моему опыту, неспособность сделать это может привести к некоторым пропущенным кадрам. Это означает, что вам нужно установить буферную информацию 'presentationTimeUs' для выходных буферов из кодировщика. Вам не нужно беспокоиться о временных отметках для звука; единственное, что MediaCodec заботится о входных звуковых методах, заключается в том, что они строго растут. MediaCodec должен выводить правильные временные метки с помощью закодированных образцов звука. – nyttimangus

 Смежные вопросы

  • Нет связанных вопросов^_^