Skip to content

Подготовка мультибитрейтных файлов

Для того, чтобы обеспечить комфортный просмотр видео пользователям, подключенным на разных скоростях к интернету, можно воспользоваться адаптивным стримингом. Для этого надо сделать мультибитрейтный MP4 файл и запросить для него манифест. Дальнейшее Flussonic Media Server сделает сам.

Ниже мы рассмотрим, как настроить компьютер и создать мультибитрейтный файл.

Установка программ

Вам нужно иметь установленный ffmpeg и кодеки. Процесс установки отличается для разных операционных систем.

Инструкция для Windows

  1. Скачайте ffmpeg: https://ffmpeg.org/download.html
  2. Следуйте инструкции по установке.
  3. Скачайте и установите K-Lite Mega Codec Pack: http://www.codecguide.com/download_k-lite_codec_pack_mega.htm. После запуска инсталлятора будет предложено несколько вариантов установки, нужно выбрать самый полный («Lots of stuff»).

Инструкция для Linux

Мы рекомендуем поставить уже собранный ffmpeg отсюда: http://johnvansickle.com/ffmpeg Или любой другой собранный ffmpeg с официального сайта: https://www.ffmpeg.org/download.html

С большой вероятностью ffmpeg, идущий в вашем дистрибутиве либо не будет уметь кодировать H264, либо будет слишком старым, чтобы подошли наши инструкции (вообще любые инструкции в интернете, которые основываются на возможностях свежих версий ffmpeg), или произойдет еще какая-нибудь другая неприятность.

Конструирование команды для ffmpeg на примере создания multi-bitrate потока

В данной статье мы рассмотрим, как создать multi-bitrate поток с использованием FFmpeg. В качестве примера возьмем видеофайл hall.mp4, который мы перекодируем в несколько вариантов с различными битрейтами и разрешениями, что особенно полезно для адаптивного стриминга.

Анализ исходного файла

Перед началом кодирования рекомендуется проверить содержимое исходного видеофайла:

ffmpeg -i hall.mp4

Подготовка к кодированию

Мы будем кодировать видео в пять различных разрешений с фиксированными битрейтами. Используем двухпроходное кодирование (two-pass encoding) для улучшения качества финального видео.

Первый проход кодирования

В первом проходе FFmpeg анализирует видео и собирает статистику для оптимального распределения битрейта:

ffmpeg -y -i hall.mp4 \
    -pass 1 \
    -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:1 \
    -c:v libx264 -sc_threshold 0 -x264-params "nal-hrd=cbr" -g 60 -b_strategy 0 -forced-idr 1 \
    -c:a libfdk_aac -b:a 160k -ac 2 \
    -b:v:0 200k -maxrate:v:0 200k -minrate:v:0 200k -bufsize:v:0 200k -filter:v:0 scale=-2:240 \
    -b:v:1 500k -maxrate:v:1 500k -minrate:v:1 500k -bufsize:v:1 500k -filter:v:1 scale=-2:360 \
    -b:v:2 1000k -maxrate:v:2 1000k -minrate:v:2 1000k -bufsize:v:2 1000k -filter:v:2 scale=-2:480 \
    -b:v:3 3000k -maxrate:v:3 3000k -minrate:v:3 3000k -bufsize:v:3 3000k -filter:v:3 scale=-2:720 \
    -b:v:4 4000k -maxrate:v:4 4000k -minrate:v:4 4000k -bufsize:v:4 4000k -filter:v:4 scale=-2:1080 \
    -f mp4 /dev/null
  • -y — автоматическое подтверждение перезаписи файлов.
  • -pass 1 — первый проход кодирования (сбор статистики).
  • -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:1 — выбор входных потоков: 5 видеопотоков и 1 аудиопоток.
  • -c:v libx264 — кодирование видео с использованием кодека H.264.
  • -g 60 — установка размера GOP (группы кадров) в 60 кадров.
  • -b:v:N Xk — битрейт каждого видеопотока (от 200k до 4000k).
  • -filter:v:N scale=-2:Y — изменение разрешения каждого видеопотока (240p, 360p, 480p, 720p, 1080p).
  • -c:a libfdk_aac -b:a 160k -ac 2 — кодирование аудиопотока в AAC с битрейтом 160k и стереоканалом.
  • -f mp4 /dev/null — в первом проходе выходной файл не создается, статистика записывается во временные файлы.

Второй проход кодирования

ffmpeg -y -i hall.mp4 \
    -pass 2 \
    -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:1 \
    -c:v libx264 -sc_threshold 0 -x264-params "nal-hrd=cbr" -g 60 -b_strategy 0 -forced-idr 1 \
    -c:a libfdk_aac -b:a 160k -ac 2 \
    -b:v:0 200k -maxrate:v:0 200k -minrate:v:0 200k -bufsize:v:0 200k -filter:v:0 scale=-2:240 \
    -b:v:1 500k -maxrate:v:1 500k -minrate:v:1 500k -bufsize:v:1 500k -filter:v:1 scale=-2:360 \
    -b:v:2 1000k -maxrate:v:2 1000k -minrate:v:2 1000k -bufsize:v:2 1000k -filter:v:2 scale=-2:480 \
    -b:v:3 3000k -maxrate:v:3 3000k -minrate:v:3 3000k -bufsize:v:3 3000k -filter:v:3 scale=-2:720 \
    -b:v:4 4000k -maxrate:v:4 4000k -minrate:v:4 4000k -bufsize:v:4 4000k -filter:v:4 scale=-2:1080 \
    -f mp4 hall_mbr.mp4
  • -pass 2 — второй проход кодирования.
  • Выходной файл hall_mbr.mp4 создается с несколькими видеопотоками разного качества.

Кодирование с использованием NVIDIA (GPU)

Пример использования аппаратного кодировщика NVIDIA (h264_nvenc):

ffmpeg -analyzeduration 11M -hwaccel cuvid -c:v h264_cuvid -vsync 2 -avoid_negative_ts disabled -i hall.mp4 -err_detect ignore_err -loglevel repeat+level+verbose -spatial-aq 1 -aq-strength 8 -y  \
    -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a:0 \
    -profile:v high -preset:v slow -threads 0 \
    -c:v h264_nvenc -cbr 1 -rc cbr_hq -2pass 1 -bf 2 -b_ref_mode 2 -g 50 -b_adapt 0 -no-scenecut 1 -forced-idr 1 -strict_gop 1 \
    -c:a libfdk_aac -b:a 128k \
    -b:v:0 650k -maxrate:v:0 700k -minrate:v:0 650k -bufsize:v:0 700k -filter:v:0 "scale_cuda=640:360" -trellis 1 \
    -b:v:1 1000k -maxrate:v:1 1100k -minrate:v:1 1000k -bufsize:v:1 1000k -filter:v:1 "scale_cuda=768:432" -trellis 1 \
    -b:v:2 2250k -maxrate:v:2 2350k -minrate:v:2 2250k -bufsize:v:2 2250k -filter:v:2 "scale_cuda=960:540" -trellis 1 \
    -b:v:3 3000k -maxrate:v:3 3100k -minrate:v:3 3000k -bufsize:v:3 3M -filter:v:3 "scale_cuda=-1:720" -trellis 1 \
    -b:v:4 5000k -maxrate:v:4 5100k -minrate:v:4 5000k -bufsize:v:4 5M -filter:v:4 "scale_cuda=-1:1080" -trellis 1 \
    -f mp4 "hall_nvenc_mbr.mp4" \
    -max_muxing_queue_size 1024
  • -hwaccel cuvid -c:v h264_cuvid – использование аппаратного декодера NVIDIA для декодирования входного видео.
  • -c:v h264_nvenc – использование кодировщика NVIDIA NVENC для кодирования видео.
  • -profile:v high – задание профиля High для улучшения качества кодирования.
  • -preset:v slow – баланс между скоростью кодирования и качеством выходного файла.
  • -cbr 1 -rc cbr_hq – использование режима постоянного битрейта (CBR) с высоким качеством.
  • -2pass 1 – двухпроходное кодирование для улучшения качества сжатия.
  • -bf 2 -b_ref_mode 2 – настройка би-директорных кадров для более эффективного кодирования.
  • -g 50 – установка размера группы кадров (GOP) в 50 кадров.
  • -b_adapt 0 -no-scenecut 1 -forced-idr 1 -strict_gop 1 – управление структурой GOP и сценами резкого перехода.
  • -b:v:N Xk -maxrate:v:N Xk -minrate:v:N Xk -bufsize:v:N Xk – задание битрейта, буферизации и ограничений для каждого качества видео.
  • -filter:v:N "scale_cuda=W:H" – масштабирование с помощью аппаратного ускорения CUDA.
  • -c:a libfdk_aac -b:a 128k – кодирование аудиопотока с использованием AAC (libfdk_aac) с битрейтом 128 кбит/с.
  • -max_muxing_queue_size 1024 – увеличение очереди мультиплексирования для предотвращения ошибок при записи в MP4.

Кодирование участка видео

Иногда нужно перекодировать не всё видео, а только какой-то его участок. Для этого используется следующий параметр: -ss 00:00:00 -t 00:05:00. Здесь первая цифра показывает, с какой секунды должен начинаться кодируемый фрагмент, а вторая цифра — его продолжительность.

ffmpeg -analyzeduration 11M -hwaccel cuvid -c:v h264_cuvid -vsync 2 -avoid_negative_ts disabled -i hall.mp4 -ss 00:00:00 -t 00:05:00 -err_detect ignore_err -loglevel repeat+level+verbose -spatial-aq 1 -aq-strength 8 -y  \
    -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a:0 \
    -profile:v high -preset:v slow -threads 0 \
    -c:v h264_nvenc -cbr 1 -rc cbr_hq -2pass 1 -bf 2 -b_ref_mode 2 -g 50 -b_adapt 0 -no-scenecut 1 -forced-idr 1 -strict_gop 1 \
    -c:a libfdk_aac -b:a 128k \
    -b:v:0 650k -maxrate:v:0 700k -minrate:v:0 650k -bufsize:v:0 700k -filter:v:0 "scale_cuda=640:360" -trellis 1 \
    -b:v:1 1000k -maxrate:v:1 1100k -minrate:v:1 1000k -bufsize:v:1 1000k -filter:v:1 "scale_cuda=768:432" -trellis 1 \
    -b:v:2 2250k -maxrate:v:2 2350k -minrate:v:2 2250k -bufsize:v:2 2250k -filter:v:2 "scale_cuda=960:540" -trellis 1 \
    -b:v:3 3000k -maxrate:v:3 3100k -minrate:v:3 3000k -bufsize:v:3 3M -filter:v:3 "scale_cuda=-1:720" -trellis 1 \
    -b:v:4 5000k -maxrate:v:4 5100k -minrate:v:4 5000k -bufsize:v:4 5M -filter:v:4 "scale_cuda=-1:1080" -trellis 1 \
    -f mp4 "hall_nvenc_mbr.mp4" \
    -max_muxing_queue_size 1024

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

Конвертация файлов для потоковой передачи в Интернете

Flussonic поддерживает следующие Контейнеры и кодеки. Если ваш видеофайл закодирован в другой формат, он не будет воспроизводиться через Flussonic. Например, могут быть старые кодеки, такие как Xvid или MPEG4-Video, которые не поддерживаются новыми версиями браузеров. В таких случаях необходимо транскодировать файл.

Чтобы преобразовать файл любого формата в H.264, в командной строке перейдите в директорию с файлом, затем выполните команду:

ffmpeg -i input_file.avi -c:v libx264 -g 100 -c:a aac -f mp4 output_file.mp4

Аналогично можно преобразовать файл любого формата в H.265/HEVC:

ffmpeg -i input_file.avi -c:v libx265 -g 100 -c:a aac -f mp4 output_file.mp4