Буферное кодирование / декодирование из захвата в 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 значения вам не помогут - они устанавливаются при настройке кодера и не влияют на синхронизацию кадров.

Другие вопросы по тегам