Частота кадров во время кастинга

524
Anmol Singh Jaggi

Я пытаюсь записать экран с помощью ffmpeg с помощью следующей команды:

ffmpeg -f x11grab -s 1366x768 -framerate 30 -i :0.0 -c:v libx264 -b:v 1000k out.mp4 

что я узнал отсюда .

Но я не могу понять, что framerateзначит в этом контексте.

Вот что я думаю :

Если бы мы конвертировали набор изображений, хранящихся в каталоге, в видео, как упомянуто здесь, частота кадров 30означала бы: «Показать первые 30 изображений в первую секунду видео, следующие 30 изображений в следующую секунду и т. Д. до тех пор, пока не будут использованы все изображения » .
Например, если бы у нас было 90 изображений, длительность получающегося видео составила бы 3 секунды.

Таким же образом, во время показа экрана должно произойти следующее:

Предположим, что моя частота обновления экрана составляет 60 Гц, 60 изображений в секунду генерируются и сохраняются в буфере.
Но, поскольку ffmpegзадана частота кадров 30, он берет первые 30 изображений (изображения № 1 - № 30) из буфера и производит 1 секунду видео, затем берет изображения № 31 - № 60 и производит следующую секунду видео,
Это означает, что в течение 1 секунды записи будет воспроизводиться 2 секунды видео.


Чтобы проверить эту теорию, я провел следующий эксперимент:

Я запустил на экране графический секундомер и заставил его работать ровно на 10 секунд, одновременно записывая секундомер с 1 по 10.

Согласно моей теории, либо произведенное видео должно было иметь 20 секунд и показывать полное количество секундомеров от 1 до 10, либо, чтобы время видео было равным времени записи, ffmpeg сгенерировал бы видео 10 секунд и показывало только половина отсчета секундомера от 1 до 5 (первые 30 * 10 = 300 кадров из 600 кадров, сгенерированных графической картой за одно и то же время).

Но ни один из вышеупомянутых двух случаев не произошел. Вместо этого продолжительность видео составляла 10 секунд, а содержание было точно таким же, как и на экране во время записи, то есть счетчик секундомера шел от 1 до 10.

Я повторил тот же эксперимент, используя частоту кадров 10 вместо 30, и нашел те же результаты, то есть длительность видео составляла 10 секунд, а количество секундомеров показывалось от 1 до 10.

Итак, что не так с моей теорией?


Единственная другая теория, о которой я мог подумать и которая согласуется с моими наблюдениями, заключается в следующем:

Поскольку ffmpeg должен записывать с частотой кадров 30 при входном потоке 60 Гц, он пропускает все остальные изображения во время видеопроизводства.
То есть он использует изображения № 1, № 3, № 5 ... № 60 для создания 1 секунды видео.

Но я не уверен, что это правильно.


Конфигурация моей системы:

  • ОС: Ubuntu 16.04

  • версия ffmpeg:
    ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311 configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100

0
Ваша вторая теория верна. FFmpeg стремится сохранить временные отношения, поэтому подача 60 кадров в секунду, настроенная на прием 30 кадров в секунду, приведет к удалению половины кадров. Gyan 7 лет назад 1
Спасибо @Mulvya. Можете ли вы сказать мне еще одну вещь - два видеовыхода (с частотой кадров 30 и 10) имеют одинаковый размер файла. Я понимаю, что это может быть связано с тем, что оба видео имеют одинаковый битрейт. Но значит ли это, что в видео с 10 кадрами в секунду бит / кадр больше, и поэтому каждый кадр будет более четким (с большей глубиной цвета), чем кадр 30 кадров в секунду? Anmol Singh Jaggi 7 лет назад 0
В общем да. Но если битрейт достаточно высок и движение нечасто, вы не заметите большой разницы. Gyan 7 лет назад 0
Поскольку я получил свой ответ, я хочу закрыть вопрос. Вы хотите написать ответ или я должен сделать это сам? Anmol Singh Jaggi 7 лет назад 0

1 ответ на вопрос

1
Gyan

FFmpeg is a time-based media processor and as such strives to maintain temporal relation of the input unless instructed otherwise.

The framerate option for the x11grab device sets the grabbing frame rate. If there are fewer or greater frames supplied each second, then ffmpeg will duplicate or drop the difference, respectively.

Похожие вопросы