14
января
2021
Перекодирование видео из переменной частоты кадров (VFR) в постоянную (CFR)
10:11

Перекодирование видео из переменной частоты кадров (VFR) в постоянную (CFR)

14 января 2021 10:11

Большинство смартфонов в видеокамер записывают видео с постоянной частотой кадров - 30 или 60 кадров в секунду.
Однако при съёмке ночью в программе GCam можно установить автоматическую частоту кадров - она снижается до 14 и ниже при нехватке света, но изображение в кадре становится более светлым. Запись с переменной частотой кадров (VFR) в обязательном порядке нужно перекодировать с постоянной частотой кадров (CFR), равным 30.

Получаем информацию о видео

Перед тем, как начать перекодирование, следует узнать параметры файла с видео разрешение, частоту кадров и параметры кодирования звука,

Выполним установку программы:

sudo apt-get install mediainfo mediainfo-gui

Вывод на экран параметров исходного видео:

mediainfo in.mp4

где in.mp4 - исходный файл.

Среди прочей информации будет выведено следующее:
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 32 s 455 ms
Bit rate : 9 603 kb/s
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 19.350 FPS
Minimum frame rate : 14.238 FPS
Maximum frame rate : 33.174 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive

Таким образом, в данном видео средний битрейт составляет 19.350 FPS (пределы изменения 14-33 FPS).

Перекодирование видео с изменением скорости кадров (FPS) в Linux

Традиционно, за обработку видео в Linux отвечает программа ffmpeg.

Как вызывать ffmpeg для изменения частоты кадров прочитал в статье:
https://trac.ffmpeg.org/wiki/ChangingFrameRate

Перекодирование видео вызывается командой:

ffmpeg -i in.mp4 -filter:v fps=fps=30 out.mp4

где in.mp4 - исходный файл
out.mp4 - файл результата.

Скорость перекодирования видео разрешением 1920x1080 на процессоре Celeron 2600 составила 0.25 кадров в секунду.
Получившееся видео имеет постоянный битрейт и частоту кадров:

Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 32 s 467 ms
Bit rate : 6 122 kb/s
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 30.000 FPS

Визуально при воспроизведении видео ничего не изменилось - так же есть небольшие рывки, вызванные низкой частотой кадров в исходном видео. Но частота кадров стала постоянной, что годится для использования в монтаже видео или размещении на хостингах, таких как Youtube или Rutube.

Регулировка качества на этапе кодирования при помощи параметра QP

Нетрудно заметить, что после перекодирования скорость потока уменьшилась (была 9603 кбайт/с, стала 6 122 кбайт/с).
Уменьшить или увеличить степень сжатия при перекодировании можно при помощи настройки квантования quantizer parameter.

Например:
-qp 23

Полная команда для перекодирования видео (параметр -qp 23 может быть другим):

ffmpeg -i in.mp4 -filter:v fps=fps=30 -qp 23 out.mp4

Зависимость битрейта тестового видео 1920x1080 с прогрессивной (p) разверткой 30 кадров в секунду от параметра qp приведена в таблице.
Чем больше qp - тем сильнее сжатие и ниже качество.

Значения итогового битрейта получены опытным путём, для видео длиной 974 кадра. В кадре присутствовало движение (ночная съёмка движения автомобиля с близкого расстояния).

Таблица 1.

-qp Bit rate
21 10.5 Mb/s
22 9 461 kb/s
23 8 682 kb/s
24 7 720 kb/s
25 7 101 kb/s
26 6 352 kb/s
27 5 588 kb/s
28 4 987 kb/s
29 4 453 kb/s
30 3 966 kb/s
31 3 546 kb/s
32 3 156 kb/s
33 2 824 kb/s
34 2 502 kb/s
35 2 236 kb/s

Рекомендуемый в статьях битрейт лежит в диапазоне 5-8 Мбит/с (значение параметра "квантователь" выходит в пределах 28-23).

Я просмотрел результирующие файлы - действительно, артефактов сжатия нет при 8 Мбит/с (QP=23...24). Признаки сжатия наступают при потоке меньше 4 Мбит/с (QP=30 и более)!

Регулировка качества видео при помощи параметра "постоянного качества" CRF

Этот способ я прочитал в статье
https://slhck.info/video/2017/02/24/crf-guide.html

Оптимальные значения crf лежат также в пределах от 18 до 25, где 18 - лучшее, 28 - наихудшее качество.

Таблица 2.

-crf Bit rate
18 10.4 Mb/s
19 9 404 kb/s
20 8 482 kb/s
21 7 628 kb/s
22 6 844 kb/s
23 6 122 kb/s
24 5 465 kb/s
25 4 867 kb/s
26 4 329 kb/s
27 3 848 kb/s
28 3 417 kb/s
29 3 032 kb/s
30 2 693 kb/s
31 2 390 kb/s

Качество видео при CRF=23 довольно хорошее. При CRF=26 при быстром перемещении камеры заметны "квадраты".

Ограничение максимальной скорости потока

Чтобы видео могло воспроизводиться в поточном режиме, нужно ограничить скорость битового потока, чтобы на самых сложных сценах битрейт не "вылетал" за пределы, ограничения канала передачи.

Верхний предел скорости при кодировании обычно ограничивают такой опцией:

-b:v 10000k
где 10000k - предельная скорость канала, килобит/секунду. Предел может быть любым, но выше, чем средний битрейт при данном crf (см. вторую таблицу выше). Этот параметр напоминает шейпинг в сетях IP - максимальная скорость ограничивается.

Какой метод регулировки качества видео, QP или CRF, выбрать?

Если использовать параметр QP - степень сжатия для динамичных и статичных сцен одинаковая. Это значит, что для статичных кадров сжатие может быть излишним, а для динамичных (на которые глаз/мозг почти не реагирует) - недостаточным.

Параметр CRF работает противоположным образом - определяет среднее "субъективное" качество для всех кадров видео. Для динамичных сцен, например, съёмки быстрых животных, проезжающих машин самые резкие переходы будут размыты (экономия битрейта), зато более медленные движения будут выглядеть лучше, чем при постоянном QP.

Дополнение. Перекодирование видео с одновременной обрезкой НАЧАЛА и КОНЦА по меткам времени

Иногда нужно обрезать начало и конец видео. Например, если попал в ДТП и нужно перекодировать видео с регистратора с моментом аварии.

Командная строка:

ffmpeg -i FILE211027-172845.MOV -qp 35 -filter:v fps=fps=30 -ss 00:00:00 -to 00:00:44 out3.mp4

где -ss начало (старт видео), -to конец (конец видео). -qp сжатие (при -qp 35 поток около 2.2 Мбит/с - максимальное сжатие).

Выводы:

  1. Программа ffmpeg позволяет перекодировать видео из переменной частоты кадров в постоянную.
  2. Управление степенью сжатия (и размером файла) позволяет гибко регулировать битрейт видео при параметров qp или crf.
  3. В кадрах с непредсказуемым движением лучше использовать CRF=20 или 21, с ограничением максимального битрейта на уровне 10 Мбит/с.

Источники:



Похожие публикации