Документация на Flussonic Media Server

  1. Быстрый старт
  2. How To
  3. Потоковое вещание
    1. Публикация
    2. Прием мультикаста
    3. Варианты источников
    4. Переключение источников
    5. Плейлисты
    6. Наложение логотипа
    7. Миксер
    8. WebRTC публикация
    9. SDI
    10. Отправка на другие сервера
    11. Распознавание DVB субтитров
  4. Транскодер
    1. Логотип
    2. Hardware
    3. Скриншоты
    4. Мозаика
  5. DRM
    1. Simple CAS
    2. Conax DRM
    3. BuyDRM (KeyOS)
  6. Авторизация
    1. Конструктор бэкендов
    2. Сервис сбора статистики
    3. Domain lock
    4. Middleware
    5. Secure links
    6. Ограничение сессий
    7. Мультиавторизация
    8. Бан IP адресов
    9. DVR
    10. Aliaser
  7. API
    1. HTTP API
    2. Events API
    3. MySQL API
    4. SQL API для кластеров
    5. SNMP
  8. Кластер
    1. Ретрансляция
    2. Кластерный захват
    3. Балансировщик нагрузки
    4. Пиринг
    5. Организация CDN
  9. VOD
    1. Кэш
    2. Облако
    3. Транскодирование файлов
  10. DVR
    1. Настройка
    2. Timeshift
    3. Catchup
    4. Проигрывание
    5. Экспорт в MP4
    6. Доступ по протоколам
    7. Timelapse
    8. API
    9. Кластеризация DVR
    10. Репликация
    11. Облако
  11. Воспроизведение
    1. HLS
    2. embed.html
    3. HTML5 с низкой задержкой
    4. Плеер HTML5 с низкой задержкой
    5. MPEG-TS
    6. RTMP
    7. DASH
    8. HDS
    9. RTSP
    10. multicast, CBR UDP
    11. WebRTC проигрывание
    12. H.265
  12. Администрирование
    1. Установка
    2. Обновление

    3. Конфигурация
    4. Мониторинг
    5. Производительность
    6. Лицензия
    7. LUA скрипты
    8. Безопасность
    9. Let's Encrypt
    10. Миграция
  13. IPTV
    1. Захват спутникового видео
    2. Транскодирование
    3. Middleware в IPTV OTT
    4. Экспорт EPG со спутника
    5. Группы каналов

Транскодирование файлов

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

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

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

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

  1. Скачайте ffmpeg: http://ffmpeg.zeranoe.com/builds/
  2. Распакуйте, например, в C:\ffmpeg.
  3. Добавьте в PATH соответствующие два каталога (C:\ffmpeg и C:\ffmpeg\bin). Чтобы добавить в PATH в Windows 8.1: нажмите «Win+Pause« > «Дополнительные параметры системы» > «Переменные среды» > таблица «Системные переменные» > строка с названием переменной «PATH» > в самое начало значения переменной добавьте "С:\ffmpeg;С:\ffmpeg\bin;" (без кавычек).
  4. Скачайте и установите K-Lite Mega Codec Pack: http://www.codecguide.com/download_k-lite_codec_pack_mega.htm. После запуска инсталлятора будет предложено несколько вариантов установки, нужно выбрать самый полный («Lots of stuff»).

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

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

Конструирование команды для ffmpeg Anchor Anchor x2

Допустим, у нас есть видеофайл "h.m4v" с двумя звуковыми дорожками (английская, русская) и двумя субтитрами (английские, русские).

Вначале нужно посмотреть, из чего он состоит, какие внутри есть потоки. Для этого в консоли печатаем:

ffmpeg -i h.m4v

На экран выведется огромное количество текста, из которого важно вот это:

 Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1331:1000 DAR 2662:1125], 1800 kb/s, 23.98 fps, 23.98 tbr, 25k tbn, 180k tbc
    Metadata:
      creation_time   : 2013-01-14 14:46:26
      handler_name    :
    Stream #0:1(rus): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 127 kb/s
    Metadata:
      creation_time   : 2013-01-14 14:47:59
      handler_name    :
    Stream #0:2(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 127 kb/s
    Metadata:
      creation_time   : 2013-01-14 14:48:19
      handler_name    :
    Stream #0:3(rus): Subtitle: mov_text (tx3g / 0x67337874)
    Metadata:
      creation_time   : 2013-01-14 14:48:38
      handler_name    :
    Stream #0:4(eng): Subtitle: mov_text (tx3g / 0x67337874)
    Metadata:
      creation_time   : 2013-01-14 14:48:38
      handler_name    :

Секции Stream, а в них - номер потока (0:0,0:1,0:2,0:3,0:4), тип потока (video, audio, subtitles) и язык (в данном случае eng и rus).

В файле, который мы стремимся получить, будут всё те же потоки, но увеличенное количество видеопотоков. Представим, что нам нужно получить видеофайл с возможностью выбора из 3 различных качеств видео.

3 потока видео + 2 потока аудио + 2 потока субтитров = 7 потоков всего.

Теперь приступаем к конструированию команды для ffmpeg.

Первая строка такая:

ffmpeg -i "/home/olegchir/temp/h.m4v" \

Обратите внимание на символ \. Это - перевод строки в Linux. В Windows вместо него используется символ ^, т.е. строка выглядит так:

ffmpeg -i "/home/olegchir/temp/h.m4v" ^

В целом эта строка означает, что мы будем конвертировать файл, лежащий по пути, заданному после ключа -i.

Далее, нужно указать, как мы будем получать потоки в выходном файле. Нужно три раза взять поток 0:0 и превратить его в 3 видеопотока в разных качествах. Поэтому пишем: -map 0:0 -map 0:0 -map 0:0 - "три раза взять поток 0:0" Далее взять каждый из оставшихся стримов (0:1, 0:2, 0:3, 0:4) по одному разу и просто скопировать. Поэтому пишем: -map 0:1 -map 0:2 -map 0:3 -map 0:4.

Вместе первые две строки выглядят так:

ffmpeg -i "/home/olegchir/temp/h.m4v" \
-map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \

Далее нужно объяснить, как все эти дорожки кодируются.

Важное замечание. Если в информации о файле все потоки считались равноправными (видео стоит в том же ряду, что и аудио), то дальше у каждого типа будут свои номера, начиная с 0. То есть, первое видео обозначается как v:0, а второе аудио - a:1.

-c:v:0 libx264 -b:v:0 1800k -metadata:s:v:0 language=eng \ - взять первую видеодорожку, кодировать как x264 с битрейтом как на исходном файле, указать что видео английское.

-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ - взять первую видеодорожку, кодировать как x264 c битрейтом 150k, указать что видео английское.

-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ - то же, что предыдущее, но с битрейтом 100k.

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

Когда на второй позиции стоит copy, никакого кодирования не происходит, копируется как есть.

Эти команды скопируют всё аудио:

-c:a:0 copy -metadata:s:a:0 language=rus \
-c:a:1 copy -metadata:s:a:1 language=eng \
-c:s:0 copy -metadata:s:s:0 language=rus \
-c:s:1 copy -metadata:s:s:1 language=eng \

Команда принимает вид:

ffmpeg -i "/home/olegchir/temp/h.m4v" \
-map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \
-c:v:0 libx264 -b:v:0 1800k -metadata:s:v:0 language=eng \
-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \
-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \
-c:a:0 copy -metadata:s:a:0 language=rus \
-c:a:1 copy -metadata:s:a:1 language=eng \
-c:s:0 copy -metadata:s:s:0 language=rus \
-c:s:1 copy -metadata:s:s:1 language=eng \

Теперь указываем параметры синхронизации и файл, куда будут писаться перекодированный видеофайл:

-async 1 -vsync 1 \
"/home/olegchir/temp/h2.m4v"

Теперь соберем все вместе. Команда будет выглядеть так:

ffmpeg -i "/home/olegchir/temp/h.m4v" \
-map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \
-c:v:0 libx264 -b:v:0 1800k -metadata:s:v:0 language=eng \
-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \
-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \
-c:a:0 copy -metadata:s:a:0 language=rus \
-c:a:1 copy -metadata:s:a:1 language=eng \
-c:s:0 copy -metadata:s:s:0 language=rus \
-c:s:1 copy -metadata:s:s:1 language=eng \
-async 1 -vsync 1 \
"/home/olegchir/temp/h2.m4v"

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

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

Можно использовать этот параметр в сочетании со многими другими. Например:

ffmpeg -i "/home/olegchir/temp/h.m4v" \
-ss 00:00:00 -t 00:05:00 \
-map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \
-c:v:0 libx264 -b:v:0 1800k -metadata:s:v:0 language=eng \
-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \
-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \
-c:a:0 copy -metadata:s:a:0 language=rus \
-c:a:1 copy -metadata:s:a:1 language=eng \
-c:s:0 copy -metadata:s:s:0 language=rus \
-c:s:1 copy -metadata:s:s:1 language=eng \
-async 1 -vsync 1 \
"/home/olegchir/temp/h2.m4v"

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

Cмена разрешения для треков с пониженным битрейтом Anchor Anchor x2

Иногда нужно не только изменить битрейт, но и уменьшить разрешение видео. Для этого используется следующий параметр: -filter:v:3 scale=320:240 Этот параметр нужно добавить к свойству трека так же, как в предыдущих примерах добавлялся битрейт или субтитры.

Разберемся, что здесь написано.

"-filter" означает, что дальше будет следовать описание фильтра, ":v:3" — это номер видеотрека, который будет присвоен треку в новом разрешении,

"scale" — название фильтра (ffmpeg поддерживает разные фильтры, конкретно этот отвечает за смену разрешения),

"320:240" — новое разрешение. Важно отметить, что если мы знаем только необходимую ширину, то высоту можно заменить на -1, т.е. "320:-1". Это позволит автоматически сохранить правильное соотношение сторон.

Теперь посмотрим, как это выглядит на практике. Для этого возьмем код из предыдущих примеров, и добавим четвертый видеотрек ("-c:v:3") с шириной 320 ("scale=320:-1"). Количество "-map 0:0" теперь 4 штуки, что соответствует четырем трекам.

ffmpeg -i "/home/olegchir/temp/h.m4v" \
-ss 00:00:00 -t 00:05:00 \
-map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \
-c:v:0 libx264 -b:v:0 1800k -metadata:s:v:0 language=eng \
-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \
-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \
-c:v:3 libx264 -b:v:3 100k -metadata:s:v:3 language=eng -filter:v:3 scale=320:-1 \
-c:a:0 copy -metadata:s:a:0 language=rus \
-c:a:1 copy -metadata:s:a:1 language=eng \
-c:s:0 copy -metadata:s:s:0 language=rus \
-c:s:1 copy -metadata:s:s:1 language=eng \
-async 1 -vsync 1 \
"/home/olegchir/temp/h2.m4v"