Медиакодек Android декодирует поток h264 в реальном времени с задержкой около 1 секунды

Я пытаюсь декодировать прямой эфир h264 с камеры WIFI с помощью madiacodec в Galaxy S3, видео воспроизводится нормально, но кажется, что низкий уровень медиакода всегда буферизует 1 секунду видеокадров, новый кадр может быть декодирован только новым входящим блоком NAL. . Это вызывает задержку около 1 секунды.

Когда вызывается MediaCodec.createDecoderByType("video/avc");, я вижу из logcat, что выделено 22 буфера,

01-04 15:39:02.799: I/ExtendedCodec(13374): Smoothstreaming Enabled
01-04 15:39:02.809: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Loaded->Idle
01-04 15:39:02.809: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Allocating 22 buffers from a native window of size 245760 on output port
01-04 15:39:02.889: D/DecodeActivity(13374): Decoder started at --- 1388867942894
01-04 15:39:02.889: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Idle->Executing
01-04 15:39:03.019: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Executing

И я вижу, что около 16 единиц NAL должны быть загружены в декодер, прежде чем я смогу получить какой-либо кадр.

У меня вопрос, зачем эта буферизация видео? в любом случае я могу попытаться выделить меньше буфера, если это проблема. Можно ли как-нибудь уменьшить эту буферизацию видео?


person user3161207    schedule 04.01.2014    source источник


Ответы (1)


Прежде всего, вы уверены, что каждый блок NAL соответствует одному кадру? H.264 не определяет, сколько единиц NAL будет в каждом кадре, это зависит от реализации кодировщика. Во-вторых, у меня возникают аналогичные проблемы при использовании устройства с чипсетом Qualcomm. Я использую не MediaCodec, а интерфейс IOMX, но в основном получаю ту же задержку. Интересно, есть ли у вас отпечатки в logcat, говорящие о том, как распределяются входные буферы. Это будет более актуально для проблемы, а не буферы на выходном порту.

person ArikYa    schedule 08.04.2014
comment
Я почти уверен, что реализация кодировщика устанавливает один NAL для одного кадра, в моем случае я думаю, что выделено 16 буферов, что, я думаю, выполняется низкоуровневым драйвером. И это фактически соответствует задержке в 1 секунду, которая у меня есть, поскольку моя частота кадров составляет 15 кадров в секунду. - person user3161207; 12.04.2014
comment
И так странно, что мой программный декодер имеет лучшую производительность с точки зрения задержки, во всяком случае, я на всякий случай реализовал оба. - person user3161207; 12.04.2014
comment
Я имел в виду отпечаток logcat, в котором говорится о выделении 22 буферов из собственного окна. Кажется, это выходные буферы, мне было интересно, печатает ли он номер для входного порта - person ArikYa; 13.04.2014