Подготовка мультибитрейтных файлов¶
Для того, чтобы обеспечить комфортный просмотр видео пользователям, подключенным на разных скоростях к интернету, можно воспользоваться адаптивным стримингом. Для этого надо сделать мультибитрейтный MP4 файл и запросить для него манифест. Дальнейшее Flussonic Media Server сделает сам.
Ниже мы рассмотрим, как настроить компьютер и создать мультибитрейтный файл.
Установка программ¶
Вам нужно иметь установленный ffmpeg и кодеки. Процесс установки отличается для разных операционных систем.
Инструкция для Windows¶
- Скачайте ffmpeg: https://ffmpeg.org/download.html
- Следуйте инструкции по установке.
- Скачайте и установите 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