Запись видео с неизвестной частотой кадров с помощью 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.