Запись видео с неизвестной частотой кадров с помощью FFmpeg

Я записываю видео с FFmpeg, и мне нужна частота кадров, с которой она написана, по крайней мере, в правом шаре. Прямо сейчас я принимаю частоту кадров, которую, по моему заявлению, использует и использует, чтобы установить частоту кадров (time_base) для моего видеопотока. Однако это иногда сильно отличается от фактической частоты кадров, которую я получаю (я видел поток, требующий 50 кадров в секунду, но публикацию со скоростью 9 кадров в секунду).

То, что я хотел бы сделать, это использовать истекший таймер и подсчитывать кадры, которые я записываю, для расчета фактической частоты кадров, которую я записал, когда закончил запись. Я бы сказал, что частота кадров установлена ​​в моем AVStream, который используется в avcodec_open2, прежде чем писать какие-либо фреймы. Если я его установлю позже (например, когда я пишу кадры), в то время как ffplay может воспроизвести его (жалуясь, что биты увеличения времени - 6, а не 4), другие видеоплееры не могут. Есть ли способ установить частоту кадров для всего файла после для записи фреймов? Если нет, то есть способ рассказать самим фреймам какую-то временную метку или частоту кадров во время записи, что приведет к действительному записанному файлу?

Ответ 1

Трюк, похоже, заключается в использовании AVCodecContext time_base и AVFrame pts более разумным способом, чем я. Если вы записываете фиксированную частоту кадров, то для параметра time_base устанавливается значение 1/частота кадров, а pts - только увеличенное число для записанного кадра.

Вместо этого теперь я запускаю истекший таймер, когда начинаю свою запись, и устанавливаю time_base на 1 по детализации таймера (в моем случае он имеет миллисекундную точность, поэтому 1000). Я устанавливаю фреймы pts на количество прошедшего времени до его кодирования. Эта комбинация приводит к видеофайлу с переменной частотой кадров, которая воспроизводится правильно.

Ответ 2

Крис. Вам нужно разработать новый механизм записи видеопотоков. Поэтому, если вы задали частоту кадров как [N], механизм записи записывает кадры по скорости.

  • Проверка метки времени для каждого кадра при написании
  • Если на секунду у вас меньше кадров, чем N, вам нужно сделать дубликаты кадров.
  • Если на секунду у вас больше кадров, чем N, вам нужно отбросить несколько кадров.

Перед записью вам нужно указать точную частоту кадров.

И ваш механизм записи видеофайлов должен работать с указанной частотой кадров.

Вы можете реализовать это с помощью ffmpeg.