Частота кадров в формате Matroska не соответствует действительности при определенных значениях.

Если используется формат Matroska, при определенных частотах кадров он записывает не точную входную частоту кадров, а немного более высокую, чем входная частота кадров.

Например:

ffmpeg -video_size 1920x1080 -f x11grab -framerate 30 -i :0.0 -c:v libx264rgb -crf 0 -preset ultrafast video.mkv

не создает запись со скоростью 30 кадров в секунду, а со скоростью 30,0003 кадра в секунду.

Это нехорошо, потому что даже незначительное изменение входной частоты кадров может вызвать сильное зависание кадров. Если только ffmpeg не ускоряет поток в 1,00001x, о чем я так не думаю при использовании x11grab.

Чтобы доказать это, можно использовать VLC для проверки частоты кадров.

Есть ли способ заставить ровно 30 кадров в секунду, или это недостаток формата?

Кроме того, uname -a:

Linux linux 4.1.15-rt17-1-rt-fixedtimers #1 SMP PREEMPT RT Sat Jan 16 01:14:52 GMT+5 2016 x86_64 GNU/Linux
Как проявляется "заикание основного кадра"? Я могу себе представить проблемы с синхронизацией, но я не могу представить, как что-то серьезное может произойти из-за ошибки скорости 1 часть на 10000.
Пожалуйста, покажите полный вывод вашей ffmpegкоманды в консоль.
Я только что заметил, что это происходит только в формате .mkv. Я обновляю информацию об этом. Вот паста: pastebin.com/yUbn1zrL
Для записи в MKV вставьте -vsync 0. Независимо от скорости исходного сигнала, MKV будет кодировать одинаковые тайминги.

Ответы (1)

MKV не хранит частоту кадров в своем контейнере. Таким образом, ffmpeg/vlc вместо этого смотрит на продолжительность кадра по умолчанию. Он видит 33,333 мс и делает математику, откуда и взялось ваше странное число.

Для получения дополнительной информации см.: https://gitlab.com/mbunkus/mkvtoolnix/wikis/Wrong-frame-rate-displayed .

Чтобы проверить это, вы можете запустить ffprobeс -show_frames. Я думаю, вы обнаружите, что время презентации для каждого кадра точное.