2015-03-11 2 views
1

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

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

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

Спасибо.

ответ

0

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

+0

avcodec.c рассчитывает задержку после того, как были записаны определенные кадры. Мой код записывает кадры в реальном времени, количество кадров и продолжительность видео не предопределены. – zindarod

+0

Нет. Это не про вычисление задержки, а в том, чтобы сбрасывать эти задержанные кадры, отправив NULL-кадры для кодирования, пока вы все еще получили выход из этого. Если бы вы не сделали этого, когда фактические кадры закончились (независимо от того, было ли это в реальном времени или нет), чем вы можете потерять около 40 кадров. Другим способом вы можете настроить libx264 для использования настройки нулевой последовательности, которая удалит всю эту буферизацию за счет качества/сжатия. – nobody555

+0

Итак, когда кадры перестают поступать с камеры, я выполняю цикл, чтобы дать NULL кадра кодеру? Мне жаль, что я не понял реальной концепции процесса кодирования в LibAV. – zindarod

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