Ошибка кодирования H264 при использовании LibAV

Я использую LibAV для мультиплексирования аудио и видео в реальном времени. Для этого вопроса я имею в виду файл output.c из примеров LibAV. Если я запишу 250 кадров со скоростью 25 кадров в секунду, используя AV_CODEC_ID_MPEG4, то выходной видеофайл будет иметь длину ровно 10 секунд. Но если я использую AV_CODEC_ID_H264 для 250 кадров со скоростью 25 кадров в секунду, то выходной видеофайл будет иметь длину примерно 8,86 секунды.

У меня есть рабочий код, который использует PortAudio и LibAV для мультиплексирования в реальном времени. В настоящее время я использую MPEG-4, но качество видео уступает H264. Если это возможно, я бы предпочел использовать H264.

У меня вопрос: как заставить H264 записывать 10 секунд видео для 250 кадров со скоростью 25 кадров в секунду?

Спасибо.


person zindarod    schedule 11.03.2015    source источник


Ответы (1)


Для кодирования вместо мультиплексирования лучше посмотреть avcodec.c и, в частности, на эта часть, где от кодировщика возвращаются задержанные кадры. Эта часть отсутствует в примере output.c.

person nobody555    schedule 11.03.2015
comment
avcodec.c вычисляет задержку после записи определенных кадров. Мой код записывает кадры в реальном времени, количество кадров и продолжительность видео не заданы заранее. - person zindarod; 12.03.2015
comment
Нет. Речь идет не о вычислении задержки, а о сбросе этих задержанных кадров путем отправки NULL-кадров для кодирования, пока вы все еще получаете результат. Если бы вы не сделали этого, когда фактические кадры закончились (независимо от того, было это в реальном времени или нет), вы можете потерять около 40 кадров. В противном случае вы можете настроить libx264 для использования настройки с нулевой задержкой, которая удалит всю эту буферизацию за счет качества/сжатия. - person nobody555; 13.03.2015
comment
Итак, когда кадры перестают поступать с камеры, я выполняю цикл, чтобы передать кодировщику NULL-кадры? Мне жаль, что я не понял реальной концепции процесса кодирования в LibAV. - person zindarod; 13.03.2015
comment
Также в avcodec.c, когда я указываю видеокодек как AV_CODEC_ID_H264 и контейнер как MP4, закодированное видео не воспроизводится ни в одном медиаплеере. - person zindarod; 13.03.2015