2015-12-21 3 views
0

Я использую MediaCodec в приложении для Android, чтобы кодировать кадры с камеры USB, а затем передавать этот необработанный поток в mp4parser для создания mp4 (уровень API - 16).Кодер MediaCodec h264 выводит большой необработанный поток

Все работает действительно хорошо на многих устройствах, но у меня есть проблемы с Galaxy S3 (I9300).

Проблема в том, что когда я отправляю кадры в кодировщик в течение 1 минуты, иногда я получаю очень большой вывод из кодировщика.

Диапазон размеров составляет от 2,5 МБ до 20 МБ. Эта проблема ухудшается при использовании более длинных клипов, например, 7 минутный диапазон составляет 9 МБ-120 МБ.

Это нормально?

Я попытался захватить ту же сцену, но все же получил разные результаты.

Настройки кодировщик:

Codec: OMX.SEC.AVC.Encoder 
Color Format: 21 
KEY_FRAME_RATE: 8.77 
KEY_BIT_RATE: ~880Kbit 

Еще одна вещь, при отправке кадров в кодере я использую:

mediaVideoCodec.queueInputBuffer(inputBufferIndex, 0, FrameData.length, computePresentationTime(frameCounter), 0); 

и функция

private long computePresentationTime(int frameIndex) { 
    return (long)(132 + (frameIndex * (1000000f/8.77f))); 
} 

Кодирование выполняется в фоновом потоке, поэтому я не уверен, что могу использовать системное время здесь, если производитель не сохранит кадр и t IME. Правильно ли это и что представляет собой 132?

Благодарим за помощь.

ответ

2

«132» означает, что код был скопирован с the CTS test, который генерирует видео, которое он кодирует. В тестовом коде создается серия кадров с постоянной частотой кадров. В рамках попытки определить, что временные метки передаются через немодифицированные и не генерируемые внутри кодеком, добавляется небольшое смещение.

При 880 Кбит/с, вы ожидаете (880/8) * (7 * 60)/1024 = 45 МБ. Большинство кодеров выполняют довольно хорошую работу по согласованию желаемой скорости. Я видел, что это плохо, когда метки времени в кадрах не соответствуют частоте кадров (например, this post), но поскольку вы создаете метки времени, я не знаю, почему это было бы.

В идеале отметка времени исходит от камеры, а не сгенерированного значения или системного времени. В противном случае у вас нет способа узнать, был ли кадр рядом с источником.

MediaCodec имеет many problems в Android 4.1 (API 16), которые были разрешены в Android 4.3 (API 18). На каком устройстве и версии Android вы тестируете?

+0

Благодарим за отзыв fadden. Устройство Samsung Galaxy S3 работает 4.4.2, а камера производит 384x288 кадров при ~ 8,77 кадра в секунду. Проблема не возникает на Nexus 5 (6.0.1) и Sony Xperia Z3 (5.1.1). – Alon

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