Буферное кодирование / декодирование из захвата в Android 4.1 (API 16)
Я искал несколько часов... Я просто хочу работающий декодер / кодировать записанный фильм. Это возможно даже на Android 4.1? Теперь я пишу только несколько килобайт в мой файл mp4. Нет ошибок
После того, как это сработает, я буду использовать KEY_FRAME_RATE и KEY_I_FRAME_INTERVAL, чтобы замедлить работу.
Я использовал mediaExtractor для настройки MediaCodec. Я вижу 3 шага (см. Суть для полного кода):
1. /
encoder.dequeueInputBuffer(5000);
extractor.readSampleData(inputBuf, offset);
ptsUsec2 = extractor.getSampleTime();
encoder.queueInputBuffer(inputBufIndex, ...);
2. /
encoder.dequeueOutputBuffer(info, 5000);
ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
//i write encodedData to a FileOutputStream (to save the MP4);
decoder.queueInputBuffer(inputBufIndex, ...);
3. /
decoder.dequeueOutputBuffer(info, 5000);
decoder.releaseOutputBuffer(decoderStatus, ...);
Вот полная функция, которую я изменил из файла Google EncodeDecodeTest: gist
Спасибо за помощь, Феликс
1 ответ
Некоторая дополнительная информация доступна на Bigflake. В частности, FAQ № 9.
Формат кадров, выходящих из декодера MediaCodec, не гарантированно будет полезным. Многие популярные устройства декодируют данные в собственный формат YUV, поэтому checkFrame()
Функция в тесте от буфера к буферу не всегда может проверить результаты. Можно ожидать, что кодер MediaCodec сможет принимать кадры, выводимые декодером, но это не гарантируется.
Кодирование по API 18+, как правило, намного проще, потому что вы можете работать с Surface, а не с ByteBuffer.
Конечно, если вам нужно только замедленное видео, вам не нужно декодировать и перекодировать поток H.264. Все, что вам нужно сделать, это изменить метки времени представления, которые находятся в оболочке.mp4. В API 18+ вы можете извлекать с помощью MediaExtractor и немедленно кодировать с помощью MediaMuxer, вообще не задействуя MediaCodec. В API 16 MediaMuxer не существует, поэтому вам понадобится другой способ обернуть H.264 в формат.mp4.
Если, конечно, у вас нет некоторого отвращения к видео с переменной частотой кадров, в этом случае вам придется перекодировать его с повторяющимися кадрами с "замедленным движением" (и соответствующим образом скорректировать временные метки). KEY_FRAME_RATE
а также KEY_I_FRAME_INTERVAL
значения вам не помогут - они устанавливаются при настройке кодера и не влияют на синхронизацию кадров.