Android mediacodec декодира h264 поток в реално време с около 1 секунда латентност

Опитвам се да декодирам h264 поток на живо от WIFI камера от madiacodec в Galaxy S3, видеото се възпроизвежда добре, но изглежда, че mediacode ниско ниво винаги буферира 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