Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

ПараметрДопустимые значенияОписание
Параметры аудио
codec

opus

mpeg4-generic

speex

ulaw

Используемый кодек аудио
bitrateЗависит от требуемого качества и пропускной способности каналовБитрейт звука, бит/с
rate

8000

11025

12000

16000

22050

24000

32000

44100

48000

Частота дискретизации звука
channels

1

2

Количество каналов
Параметры видео
codec

h264

mpv

vp8

Используемый кодек видео
bitrateЗависит от требуемого качества и пропускной способности каналовБитрейт видео, кбит/с
widthЗависит от требуемого качества и пропускной способности каналовШирина картинки
heightЗависит от требуемого качества и пропускной способности каналовВысота картинки
codeImpl

FF

OPENH264

Используемый кодек видео, по умолчанию FF
gopЗависит от требуемого качества и пропускной способности каналовЧастота отправки ключевых кадров (GOP)
fpsЗависит от требуемого качества и пропускной способности каналовЧастота кадров
qualityЗависит от требуемого качества и пропускной способности каналовКачество видео
preset

ultrafast

superfast

veryfast

faster

fast

medium

slow

slower

veryslow

placebo

Пресет FF, по умолчанию ultrafast
profileЗависит от требуемого качества

66 (Baseline)

77 (Main)

88 (Extended)

100 (High)

Профиль кодирования FF, по умолчанию 66 (Baseline)
levelЗависит от требуемого качестваУровень кодирования FF, по умолчанию 3.1

...

Вышеописанные настройки указываются на Transcoder узлах.

Управление профилями транскодинга при помощи REST API

Для управление профилями транскодинга на лету, без перезапуска сервера, служит специальное REST API

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://test.flashphoner.com:8081/rest-api/cdn/profile/print
  • HTTPS: https://test.flashphoner.com:8444/rest-api/cdn/profile/print

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /cdn/profile/print - используемый REST-метод

REST запросы необходимо отправлять на Edge сервер. Изменения в профилях сохраняются в памяти и применяются немедленно, а также записываются в файл cdn_profiles.yml для использования после перезапуска сервера.

REST-методы и статусы ответа

...

REST-метод

...

Пример тела REST-запроса

...

Пример тела REST-ответа

...

Статусы ответа

...

Описание

...

/cdn/profile/add

Code Block
languagejs
themeRDark
{
"name": "-profile1",
"profile": {
        "audio": {
            "type": "audio",
            "bitrate": 0, 
            "codec": "opus", 
            "rate": 48000 
        }, 
        "video": {
            "type": "video", 
            "bitrate": 0, 
            "codec": "h264", 
            "codecImpl": "FF", 
            "fps": 30, 
            "gop": 90, 
            "height": 360, 
            "quality": 0, 
            "width": 640
        }
}
}

...

200 – OK

400 - Bad Request

409 - Conflict

500 – Internal Server Error

...

Добавить профиль транскодинга

...

languagejs
themeRDark

Поддержка нескольких каналов звука

Начиная со сборки 5.2.773, поддерживается транскодирование звука по профилю с указанием количества каналов (1 - моно, 2 - стерео)

Code Block
languageyml
themeRDark
profiles:
 -240p:
  audio:
    codec : mpeg4-generic
    rate : 48000
    channels: 1
  video:
    height : 240
    bitrate : 300
    gop : 50
    codec : h264

Для того, чтобы подписчик на Edge сервере мог играть стерео звук при публикации потока со стерео звуком, количество каналов в профиле должно соответствовать количеству каналов в оригинальном потоке, т.е.

Code Block
languageyml
themeRDark
profiles:
 -240p:
  audio:
    codec : mpeg4-generic
    rate : 48000
    channels: 2

Если кодек, частота дискретизации и количество каналов профиля совпадают с параметрами звуковой дорожки в оригинальном потоке, то звук будет передан на Edge сервер без транскодирования.

Управление профилями транскодинга при помощи REST API

Для управление профилями транскодинга на лету, без перезапуска сервера, служит специальное REST API

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://test.flashphoner.com:8081/rest-api/cdn/profile/print
  • HTTPS: https://test.flashphoner.com:8444/rest-api/cdn/profile/print

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /cdn/profile/print - используемый REST-метод

REST запросы необходимо отправлять на Edge сервер. Изменения в профилях сохраняются в памяти и применяются немедленно, а также записываются в файл cdn_profiles.yml для использования после перезапуска сервера.

REST-методы и статусы ответа

video400quality25 } } } "-240p": {audiobitrate0channelsopusrate48000type"audio" }, video{bitrate0codec"h264"codecImpl"FF", "fps": 25, "gop": 50,

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/cdn/profile/add

Code Block
languagejs
themeRDark
{
"name": "-profile1",
"profile": {
        "
audio": {
            "type": "audio",
            "bitrate": 
0, 
            "
codec": 
"opus", 
           

200 – OK

400 - Bad Request

404 - Not Found

500 – Internal Server Error

Изменить профиль транскодинга/cdn/profile/print
Code Block
languagejs
themeRDark
 "rate": 48000 
        }, 
        "
video": {
            "
type": 
"video", 
            "
bitrate": 0, 
            "codec": "
h264", 
            "
codecImpl": 
"FF", 
            "
fps": 
30, 
      
 
     
"
gop": 
90, 
            "
height": 
360, 
            "
quality": 
0, 
            "
width": 
640
        
}
}
}





200 – OK

400 - Bad Request

409 - Conflict

500 – Internal Server Error

Добавить профиль транскодинга

/cdn/profile/modify
Code Block
languagejs
themeRDark
{
"name": "-profile1",
"profile": {
        "heightvideo": 240, {
            "presetbitrate": "veryfast"400, 
            "quality": 0, 25
            "type": "video", 
            "width": 0
        }
    }, 
    "-480p}
}
}




200 – OK

400 - Bad Request

404 - Not Found

500 – Internal Server Error

Изменить профиль транскодинга
/cdn/profile/print
Code Block
languagejs
themeRDark
    "-240p": {
        "audio": {
            "bitrate": 0, 
            "channels": 0, 
            "codec": "opus", 
            "rate": 48000, 
            "type": "audio"
        }, 
        "video": {
            "bitrate": 0, 
            "codec": "h264", 
            "codecImpl": "FF", 
            "fps": 25, 
            "gop": 50, 
            "height": 480240, 
            "preset": "veryfast", 
            "quality": 0, 
            "type": "video", 
            "width": 0
        }
    }

200 – OK

404 - Not Found

500 – Internal Server Error

Получить список профилей транскодирования/cdn/profile/remove
Code Block
languagejs
themeRDark
{
"name": "-profile1"
}

200 – OK

404 - Not Found

500 – Internal Server Error

Удалить профиль транскодирования

Параметры

{
"audio": {
"type": "audio"
"bitrate": 0,



},
"video{
type":,



30,
90,
360
"quality0
"width": 640
}

Имя параметра

Описание

Пример

name

Имя профиля

-profile1

profile

Параметры профиля

, 
    "-480p": {
        "audio": {
            "bitrate": 0, 
            "channels": 0,
 
            "codec": "opus",
 
            "rate": 48000,
 
            "type": 
"
audio"
        }, 
        "video"
: {
            "bitrate": 0, 

            "codec": "h264",
 
            "codecImpl": "FF",
 
            "fps": 
25, 
            "gop": 
50, 
            "height": 
480,
 
            "preset": 
"veryfast", 

Параметры профиля обязательно должны содержать разделы audio или video.

Основными параметрами профиля являются следующие:

  • audio:
    • bitrate
    • codec
    • rate
  • video:
    • bitrate
    • codec
    • width
    • height
    • quality

Если какие-либо из этих параметров не указаны при создании профиля, они будут добавлены в профиль со значением 0 для числовых и "" для строковых параметров, при этом будут применены значения по умолчанию.

Остальные параметры являются дополнительными и могут отсутствовать в профиле:

  • video:
    • codecImpl
    • fps
    • gop
    • level
    • preset
    • profile

При изменении профиля изменяются только переданные параметры. Для сброса какого-либо из основных параметров к значению по умолчанию, либо для удаления из профиля дополнительного параметра необходимо передать -1, например:

Code Block
languagejs
themeRDark
{
"name": "-profile1",
"profile": {
        "video": {
            "bitrate": -1, 
            "codecImpl": -1
        }
}
}

Изменение используемых профилей

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

В каких случаях поток транскодируется на Edge сервере

Транскодинг потока на Edge сервере включается в следующих случаях:

1. Если аудио кодека или частоты дискретизации, указанных в настройках профиля, нет в SDP подписчика, аудио дорожка будет транскодирована в один из форматов, поддерживаемых подписчиком.

2. Если заданы граничные параметры для подписчика: например, высота или битрейт видео. Поэтому при транскодировании по профилю желаемые граничные параметры следует указывать в профиле и не задавать для подписчиков.

Для подписчика следует применять профиль, соответствующий технологии, используемой подписчиком. Например, для подписчика, использующего WSPlayer, применить профиль с кодеками ulaw и mpv, а для RTMP - mpeg4-generic и h264.

Сохранение соотношения сторон видео при транскодировании по профилю

Если на всех узлах CDN включено сохранение соотношения сторон при транскодировании (по умолчанию), то при транскодировании потока на Transcoder узле также будет сохранено исходное соотношение сторон, с которым этот поток был опубликован на Origin. Например, если к потоку 640x480 (4:3) применяется профиль 16:9

Code Block
languageyml
themeRDark
 profile1:
  audio:
    codec : opus
    rate : 48000
  video:
    width : 320
    height : 180
    gop : 90
    fps : 30
    codec : h264

поток будет транскодирован в 320x240 (4:3).

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

Code Block
languageyml
themeRDark
 profile3:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 180

Настройка транскодеров для работы в условиях больших нагрузок

При транскодинге большого количества потоков на сервере возрастает нагрузка на процессор сервера. Если процессор не успевает обрабатывать кадры всех потоков, очереди кадров на кодирование занимают оперативную память сервера (не JVM heap!). В зависимости от используемых в системе библиотек распределения памяти (malloc) это может приводить к утечкам памяти и, как следствие, к остановке сервера.

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

  • приостановка декодирования входящих потоков, если очереди на кодирование переполнены
  • использование библиотеки jemalloc

Приостановка декодирования входящих потоков

Приостановка декодирования входящих потоков дает возможность сгладить (но не ликвидировать) пиковые нагрузки на сервер, при условии выставления этих настроек для группы транскодеров, и включается при помощи следующего параметра

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors=true

Размер очереди, по достижении которого декодирование приостанавливается, задается в кадрах следующей настройкой

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors_max_queue_size=3

Интервал ожидания освобождения очереди задается в миллисекундах

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors_timeout=33

Использование библиотеки jemalloc для распределения памяти

По умолчанию, в большинстве случаев используется библиотека распределения памяти, входящая в состав glibc. Чтобы избежать утечек памяти под большими нагрузками, рекомендуется переключить Transcoder узлы на использование библиотеки jemalloc следующим образом (на примере Centos 7):

1. Установить компоненты, необходимые для сборки

Code Block
languagebash
themeRDark
yum -y install autoconf libtool pkg-config g++ make cmake bzip

2. Скачать исходный код библиотеки

Code Block
languagebash
themeRDark
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2

3. Распаковать архив

Code Block
languagebash
themeRDark
tar -xvjf jemalloc-5.2.1.tar.bz2

4. Собрать библиотеку

Code Block
languagebash
themeRDark
cd jemalloc-5.2.1
./configure && make && make install

5. В файле /usr/local/FlashphonerWebCallServer/bin/setenv.sh закомментировать следующую строку

Code Block
languagebash
themeRDark
export MALLOC_ARENA_MAX=4

и добавить следующую строку

Code Block
languagebash
themeRDark
export LD_PRELOAD=/usr/local/lib/libjemalloc.so

6. В файле настроек flashphoner.properties переключить используемый декодер на OpenH264

Code Block
themeRDark
decoder_priority=OPENH264,FF

...


            "quality": 0, 
            "type": "video", 
            "width": 0
        }
    }

200 – OK

404 - Not Found

500 – Internal Server Error

Получить список профилей транскодирования
/cdn/profile/remove
Code Block
languagejs
themeRDark
{
"name": "-profile1"
}




200 – OK

404 - Not Found

500 – Internal Server Error

Удалить профиль транскодирования

Параметры

Имя параметра

Описание

Пример

name

Имя профиля

-profile1

profile

Параметры профиля

{
"audio": {
"type": "audio"
"bitrate": 0,
"channels": 0,
"codec": "opus",
"rate": 48000,
},
"video": {
"type": "video",
"bitrate": 0,
"codec": "h264",
"codecImpl": "FF",
"fps": 30,
"gop": 90,
"height": 360,
"quality": 0,
"width": 640
}

Параметры профиля обязательно должны содержать разделы audio или video.

Основными параметрами профиля являются следующие:

  • audio:
    • bitrate
    • codec
    • rate
  • video:
    • bitrate
    • codec
    • width
    • height
    • quality

Если какие-либо из этих параметров не указаны при создании профиля, они будут добавлены в профиль со значением 0 для числовых и "" для строковых параметров, при этом будут применены значения по умолчанию.

Остальные параметры являются дополнительными и могут отсутствовать в профиле:

  • video:
    • codecImpl
    • fps
    • gop
    • level
    • preset
    • profile

При изменении профиля изменяются только переданные параметры. Для сброса какого-либо из основных параметров к значению по умолчанию, либо для удаления из профиля дополнительного параметра необходимо передать -1, например:

Code Block
languagejs
themeRDark
{
"name": "-profile1",
"profile": {
        "video": {
            "bitrate": -1, 
            "codecImpl": -1
        }
}
}

Изменение используемых профилей

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

В каких случаях поток транскодируется на Edge сервере

Транскодинг потока на Edge сервере включается в следующих случаях:

1. Если аудио кодека или частоты дискретизации, указанных в настройках профиля, нет в SDP подписчика, аудио дорожка будет транскодирована в один из форматов, поддерживаемых подписчиком.

2. Если заданы граничные параметры для подписчика: например, высота или битрейт видео. Поэтому при транскодировании по профилю желаемые граничные параметры следует указывать в профиле и не задавать для подписчиков.

Для подписчика следует применять профиль, соответствующий технологии, используемой подписчиком. Например, для подписчика, использующего WSPlayer, применить профиль с кодеками ulaw и mpv, а для RTMP - mpeg4-generic и h264.

Сохранение соотношения сторон видео при транскодировании по профилю

Если на всех узлах CDN включено сохранение соотношения сторон при транскодировании (по умолчанию), то при транскодировании потока на Transcoder узле также будет сохранено исходное соотношение сторон, с которым этот поток был опубликован на Origin. Например, если к потоку 640x480 (4:3) применяется профиль 16:9

Code Block
languageyml
themeRDark
 profile1:
  audio:
    codec : opus
    rate : 48000
  video:
    width : 320
    height : 180
    gop : 90
    fps : 30
    codec : h264

поток будет транскодирован в 320x240 (4:3).

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

Code Block
languageyml
themeRDark
 profile3:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 180

Настройка транскодеров для работы в условиях больших нагрузок

При транскодинге большого количества потоков на сервере возрастает нагрузка на процессор сервера. Если процессор не успевает обрабатывать кадры всех потоков, очереди кадров на кодирование занимают оперативную память сервера (не JVM heap!). В зависимости от используемых в системе библиотек распределения памяти (malloc) это может приводить к утечкам памяти и, как следствие, к остановке сервера.

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

  • приостановка декодирования входящих потоков, если очереди на кодирование переполнены
  • использование библиотеки jemalloc

Приостановка декодирования входящих потоков

Приостановка декодирования входящих потоков дает возможность сгладить (но не ликвидировать) пиковые нагрузки на сервер, при условии выставления этих настроек для группы транскодеров, и включается при помощи следующего параметра

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors=true

Размер очереди, по достижении которого декодирование приостанавливается, задается в кадрах следующей настройкой

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors_max_queue_size=3

Интервал ожидания освобождения очереди задается в миллисекундах

Code Block
themeRDark
streaming_video_decoder_wait_for_distributors_timeout=33

Использование библиотеки jemalloc для распределения памяти

По умолчанию, в большинстве случаев используется библиотека распределения памяти, входящая в состав glibc. Чтобы избежать утечек памяти под большими нагрузками, рекомендуется переключить Transcoder узлы на использование библиотеки jemalloc следующим образом (на примере Centos 7):

1. Установить компоненты, необходимые для сборки

Code Block
languagebash
themeRDark
yum -y install autoconf libtool pkg-config g++ make cmake bzip

2. Скачать исходный код библиотеки

Code Block
languagebash
themeRDark
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2

3. Распаковать архив

Code Block
languagebash
themeRDark
tar -xvjf jemalloc-5.2.1.tar.bz2

4. Собрать библиотеку

Code Block
languagebash
themeRDark
cd jemalloc-5.2.1
./configure && make && make install

5. В файле /usr/local/FlashphonerWebCallServer/bin/setenv.sh закомментировать следующую строку

Code Block
languagebash
themeRDark
export MALLOC_ARENA_MAX=4

и добавить следующую строку

Code Block
languagebash
themeRDark
export LD_PRELOAD=/usr/local/lib/libjemalloc.so

6. В файле настроек flashphoner.properties переключить используемый декодер на OpenH264

Code Block
themeRDark
decoder_priority=OPENH264,FF

7. Перезапустить WCS.

Снижение порога многопоточного кодирования

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

Code Block
themeRDark
video_encoder_second_thread_threshold=408950

Уменьшение количества выделений памяти при декодировании

Для уменьшения количества выделений памяти при декодировании в сборке 5.2.559 добавлена возможность использования пула буферов для декодированных картинок. Эта возможность включается настройкой

Code Block
themeRDark
decoder_buffer_pool=true

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

Code Block
themeRDark
decoder_buffer_pool_stats=true

Статистика доступна по запросу (только в формате JSON)

Code Block
languagebash
themeRDark
curl -s 'http://localhost:8081/?action=stat&format=json&groups=decoder_buffer_pool_stats'

и сгруппирована по пулам

Code Block
languagejs
themeRDark
{
  "decoder_buffer_pool_stats": {
    "decoder_buffer_pool_info": {
      "decoder_buffer_pool_info_pools": {
        "3072x1536": {
          "decoder_buffer_pool_width": 3072,
          "decoder_buffer_pool_height": 1536,
          "decoder_buffer_pool_size_bytes": 84934656,
          "decoder_buffer_pool_leased": 6,
          "decoder_buffer_pool_allocated": 12
        },
        "1280x720": {
          "decoder_buffer_pool_width": 1280,
          "decoder_buffer_pool_height": 720,
          "decoder_buffer_pool_size_bytes": 688584704,
          "decoder_buffer_pool_leased": 0,
          "decoder_buffer_pool_allocated": 3605
        }
      },
      "decoder_buffer_pool_total_size_bytes": 773519360
    }
  }
}

Здесь

  • decoder_buffer_pool_total_size_bytes - общий размер памяти, выделенной под пулы, в байтах
  • decoder_buffer_pool_width - высота картинки
  • decoder_buffer_pool_height - ширина картинки
  • decoder_buffer_pool_size_bytes - размер памяти, выделенной под пул, в байтах
  • decoder_buffer_pool_leased - количество используемых буферов
  • decoder_buffer_pool_allocated - количество выделенных буферов в пуле

При необходимости, память, выделенная под неиспользуемые буфера, может быть очищена при помощи REST API запроса /debug/decoder/shrink_buffer_provider_pools

Освобождение памяти, выделенной под неиспользуемые буфера

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://test.flashphoner.com:8081/rest-api/debug/decoder/shrink_buffer_provider_pools
  • HTTPS: https://test.flashphoner.com:8444/rest-api/debug/decoder/shrink_buffer_provider_pools

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /debug/decoder/shrink_buffer_provider_pools - используемый REST-метод

REST запросы необходимо отправлять на Transcoder сервер.

REST-метод

Статусы ответа

Описание

/debug/decoder/shrink_buffer_provider_pools

200 – OK

500 – Internal Server Error

Сжать пулы буферов декодирования

Транскодирование по двум и более профилям с одинаковыми параметрами видео

На Edge узлах могут быть определены несколько профилей с одинаковыми параметрами видео, но различными параметрами аудио, например для воспроизведения по HLS и WebRTC:

Code Block
languageyml
themeRDark
  -240p-HLS:
    audio:
      codec: mpeg4-generic
    video:
      height: 240
      bitrate: 300
      codec: h264
  -240p-WebRTC:
    audio:
      codec: opus
    video:
      height: 240
      bitrate: 300
      codec: h264

В этом случае, если поток транскодируется на одном и том же Transcoder узле по двум таким профилям, будет использован один кодировщик видео и два кодировщика аудио.

Предотвращение транскодирования к более высоким разрешениям

В сборке 5.2.607 добавлена возможность избежать транскодирования потока к более высоким разрешениям. Эта возможность включается при помощи настройки

Code Block
themeRDark
cdn_strict_transcoding_boundaries=true

В этом случае, если с Edge сервера запросить поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge получит оригинальный поток напрямую с Origin без транскодирования. Сравнение разрешений производится по высоте.

При необходимости, можно запретить запрашивать c Edge поток по профилям с более высоким разрешением при помощи параметра

Code Block
themeRDark
cdn_strict_transcoding_throws_exception=true

Тогда при попытке запросить с Edge поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge не сможет выбрать маршрут для воспроизведения потока, и клиент получит ошибку.

Эти настройки должны указываться на Edge сервере.

Ограничения

1. Если транскодирование к более высоким разрешениям запрещено, в настройках профиля транскодирования обязательно должна быть указана высота.

Выбор маршрута для воспроизведения потока

...

получаем:

1. Запрашиваемый профиль:

Code Block
languagejs
themeRDark
    "REQUESTED-PROFILE": [
        "AUDIO{bitrate=0, codec='pcma', rate=8000, channels=1}"
    ],

2. На Transcoder создан профиль транскодирования:

Code Block
languagejs
themeRDark
    "REQUESTED1-PROFILE-192.168.1.220": [
        "AUDIO{bitrate=0, codec='pcmaopus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='null', quality=null}",
        "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}"
    ],

23. На Transcoder создан профиль транскодирования:Поток захватывается через Transcoder

Code Block
languagejs
themeRDark
    "12-PROFILESTREAM-192.168.1.220": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='null', quality=null}",
        "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}"
    ],
    "3-NEW-TRANSCODER-192.168.1.220": [],

3. Поток захватывается через Transcoder4. Параметры публикации потока на Origin:

Code Block
languagejs
themeRDark
    "23-STREAMPROXY-192.168.1.220219": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='null', quality=null}",
        "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}"
    ],
    "3-NEW-TRANSCODER-192.168.1.220": [],

...



Воспроизведение потока с Transcoder с транскодингом видео

Воспроизводим поток test на Edge по профилю

Code Block
languagejsyml
themeRDark
    "3-PROXY-192.168.1.219": [opus-vp8:
  audio:
    codec : opus
  "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}", : 48000
    channels : 2
  video:
    width : 320
    height : 240
    gop : 60
    fps : 30
    "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}"
    ]

Воспроизведение потока с Transcoder с транскодингом видео

Воспроизводим поток test на Edge по профилю

Code Block
languageyml
themeRDark
 -opus-vp8:
  audio:
    codec : opus
    rate : 48000
    channels : 2
  video:
    width : 320
    height : 240
    gop : 60
    fps : 30
    codec : vp8
    codecImpl : FF

В ответ на запрос

Code Block
languagejs
themeRDark
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes
{
    "streamName": "test-webrtc-opus-vp8"
}

получаем:

...

codec : vp8
    codecImpl : FF

В ответ на запрос

Code Block
languagejs
themeRDark
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes
{
    "streamName": "test-webrtc-opus-vp8"
}

получаем:

1. Запрашиваемый профиль:

Code Block
languagejs
themeRDark
    "REQUESTED-PROFILE": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='vp8', codecImpl='FF', quality=null}"
    ],

2. На Transcoder создан профиль транскодирования:

Code Block
languagejs
themeRDark
    "REQUESTED-PROFILE1-PROFILE-192.168.1.220": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}",
        "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='vp8VP8', codecImpl='FF', quality=null}"
    ],

23. На Transcoder создан профиль транскодирования:Поток захватывается через Transcoder

Code Block
languagejs
themeRDark
    "12-PROFILESTREAM-192.168.1.220": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}",
        "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='VP8', codecImpl='FF', quality=null}"
    ],

...


    "3-NEW-TRANSCODER-192.168.1.220": [],

4. Параметры публикации потока на Origin:

Code Block
languagejs
themeRDark
    "23-STREAMPROXY-192.168.1.220219": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}",
        "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='VP8', codecImpl='FF', quality=null}"
    ],
    "3-NEW-TRANSCODER-192.168.1.220": [],

4. Параметры публикации потока на Origin:

Code Block
languagejs
themeRDark
    "3-PROXY-192.168.1.219": [
        "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
        "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}"
    ]

Анонсирование потока в CDN по получению ключевого кадра

По умолчанию, потоки, опубликованные на Origin узлах, анонсируются в CDN и становятся доступными для построения маршрутов и проигрывания сразу после публикации. При этом разрешение и соотношение сторон картинки видеопотока неизвестны до тех пор, пока публикующий клиент не пришлет ключевой кадр.

...

]

Анонсирование потока в CDN по получению ключевого кадра

По умолчанию, потоки, опубликованные на Origin узлах, анонсируются в CDN и становятся доступными для построения маршрутов и проигрывания сразу после публикации. При этом разрешение и соотношение сторон картинки видеопотока неизвестны до тех пор, пока публикующий клиент не пришлет ключевой кадр.

В некоторых случаях, на Edge узлах необходимо знать разрешение и соотношение сторон потока, как только он стал доступен в CDN. Для этого, начиная со сборки 5.2.404, Origin может анонсировать поток только после получения ключевого кадра. Эта возможность включается настройкой

Code Block
themeRDark
cdn_advertise_streams_by_kframe=true

Отметим, что аудио потоки (без видеодорожки) не будут доступны в CDN при такой настройке, поскольку не содержат ключевых кадров.

Распределение нагрузки по Transcoder узлам

Определение загрузки узла, исходя из загрузки процессора

Если в CDN входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкой

Code Block
themeRDark
cdn_node_load_average_threshold=1.0

Эта величина задает соотношение между средней загрузкой процессора (параметр JVM SystemLoadAverage) и количеством процессорных ядер с учетом гипертрединга. Если значение превышено, Transcoder перестает участвовать в выборе маршрута для новых потоков и профилей. При этом в секции PROFILE данный узел отображается в маршрутах потока для тех профилей, по которым уже транскодируется этот поток.

Текущее состояние узла (участвует ли он в выборе маршрута для новых потоков) можно определить при помощи REST API. Узел в статусе NEW_STREAMS_ALLOWED может принимать новые потоки для транскодирования, узел в статусе GROUP_CONNECTION_ALLOWED может только отдавать потоки, которые на нем уже транскодируются.

Настройка должна задаваться на Transcoder узлах. Также эта настройка может задаваться на Origin узлах, в этом случае при помощи REST API можно контролировать загрузку Origin сервера и при достижении статуса GROUP_CONNECTION_ALLOWED публиковать потоки на другом Origin сервере.

Ограничение количества кодировщиков (encoders) видео на Transcoder узлах

При необходимости, на Transcoder узлах может быть ограничено максимальное количество одновременно используемых кодировщиков (encoders) видео при помощи настройки

Code Block
themeRDark
cdn_transcoder_video_encoders_threshold=10000

При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED. Учитываются все кодировщики на сервере, например, если один поток транскодируется по двум профилям, будет использовано 3 кодировщика, включая кодировщик PNG.

Настройка должна задаваться на Transcoder узлах

Ограничение общей нагрузки на декодирование

В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на декодирование потоков. Например, для того, чтобы разрешить декодирование не более чем 20 потоков 1080p 30 fps, необходимо установить следующее значение

Code Block
themeRDark
cdn_advertisetranscoder_video_streamsdecoders_byload_kframethreshold=true1244160000

Отметим, что аудио потоки (без видеодорожки) не будут доступны в CDN при такой настройке, поскольку не содержат ключевых кадров.

Распределение нагрузки по Transcoder узлам

Определение загрузки узла, исходя из загрузки процессора

Если в CDN входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкой

Code Block
themeRDark
cdn_node_load_average_threshold=1.0

Эта величина задает соотношение между средней загрузкой процессора (параметр JVM SystemLoadAverage) и количеством процессорных ядер с учетом гипертрединга. Если значение превышено, Transcoder перестает участвовать в выборе маршрута для новых потоков и профилей. При этом в секции PROFILE данный узел отображается в маршрутах потока для тех профилей, по которым уже транскодируется этот поток.

Текущее состояние узла (участвует ли он в выборе маршрута для новых потоков) можно определить при помощи REST API. Узел в статусе NEW_STREAMS_ALLOWED может принимать новые потоки для транскодирования, узел в статусе GROUP_CONNECTION_ALLOWED может только отдавать потоки, которые на нем уже транскодируютсячто соответствует произведению

Code Block
themeRDark
1920 * 1080 * 30 * 20

При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED.

Настройка должна задаваться на Transcoder узлах.

Ограничение общей нагрузки на кодирование

В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на кодирование потоков. Например, для того, чтобы разрешить кодирование не более чем 20 потоков 720p, 480p и 240p 25 fps, необходимо установить следующее значение

Code Block
themeRDark
cdn_transcoder_video_encoders_load_threshold=716400000

что соответствует сумме

Code Block
themeRDark
1280 * 720 * 25 * 20 + 852 * 480 * 25 * 20 + 426 * 240 * 25 * 20

При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED.

Настройка должна задаваться на Transcoder узлах. Также эта настройка может задаваться на Origin узлах, в этом случае при помощи REST API можно контролировать загрузку Origin сервера и при достижении статуса GROUP_CONNECTION_ALLOWED публиковать потоки на другом Origin сервере.

Ограничение количества кодировщиков (encoders) видео на Transcoder узлах

При необходимости, на Transcoder узлах может быть ограничено максимальное количество одновременно используемых кодировщиков (encoders) видео при помощи настройки

Ограничение процента деградации потоков

В сборке 5.2.594 добавлена возможность установить ограничение на процент деградации потоков. Например, для того, чтобы остановить прием новых потоков на транскодирование при деградации 10% потоков на сервере, необходимо установить следующее значение

Code Block
themeRDark
cdn_transcoder_videodegraded_encodersstreams_threshold=1000010

При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED. Учитываются все кодировщики на сервере, например, если один поток транскодируется по двум профилям, будет использовано 3 кодировщика, включая кодировщик PNGНеобходимо отметить, что потоки начинают деградировать, как правило, из-за того, что кодировщику либо декодировщику не хватает производительности, и очереди картинок на кодирование/декодирование к моменту деградации вырастают до больших значений, что ведет к расходованию оперативной памяти. Таким образом, следует использовать этот параметр только как дополнительный к ограничениям общей нагрузки на кодирование/декодирование.

Настройка должна задаваться на Transcoder узлах.

Равномерное распределение нагрузки по узлам

...

Имя параметра

Описание

Пример

globalState

Статус узла: ACTIVE или PASSIVE

ACTIVE

id

Адрес узла

192.168.1.64
processingState, state

Участвует ли узел в выборе маршрута для воспроизведения потоков:

NEW_STREAMSSTREAMS_ALLOWED - участвует

CONNECTION_ALLOWED - участвуетпозволяет только забирать уже транскодируемые потоки, в том числе по новым профилям

GROUP_CONNECTION_ALLOWED - не участвует

NEW_STREAMS_ALLOWED
roleРоль узла: ORIGIN, TRANSCODER или EDGE
ORIGIN

...

Текущее состояние узла определяется следующим образом в порядке приоритета:
1. Если есть значение, заданное принудительно при помощи запроса /cdn/enforce_state, то выбирается это значение.
2. Если достигнуто ограничение по нагрузке процессора, то выбирается состояние GROUP_CONNECTIONS_ALLOWED.
3. Если достигнуто ограничение по кодировщикам видео, то выбирается состояние _state, то выбирается это значение.
2. Если достигнуто ограничение по нагрузке процессора, то выбирается состояние GROUP_CONNECTIONS_ALLOWED.
3. Если достигнуто ограничение по кодировщикам видео, то выбирается состояние GROUP_CONNECTIONS_ALLOWED.
4. Если ограничения не достигнуты, то выбирается состояние NEW_STREAMS_ALLOWED.

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

Code Block
themeRDark
cdn_nodes_state_refresh_interval=60000

По умолчанию, периодичность рассылки составляет 60 секунд. Для Transcoder узлов рекомендуется уменьшить это значение до 1 секунды, чтобы своевременно распределять потоки на другие узлы.

Настройка состояния Transcoder  узла при достижении ограничений по производительности

В сборке 5.2.640 добавлена настройка, позволяющая указать состояние, в которое перейдет Transcoder узел при достижении любого из ограничений, по умолчанию GROUP_CONNECTIONS_ALLOWED

Code Block
themeRDark
cdn_transcoder_threshold_state=GROUP_CONNECTIONS_ALLOWED

...

При необходимости, чтобы предотвратить размазывание потока по CDN, можно переводить Transcoder в состояние CONNECTIONS_ALLOWED

Code Block
themeRDark
cdn_transcoder_nodesthreshold_state_refresh_interval=60000

...

=CONNECTIONS_ALLOWED

В этом состоянии, Transcoder будет позволять забирать потоки, которые уже на нем декодируются, в том числе по новым профилям. Например, если на Transcoder узле транскодируется поток test по профилю 360p, и какой-либо Edge сервер запросит поток test240p, маршрут для воспроизведения будет построен через этот же Transcoder.

Данная настройка должна устанавливаться на Transcoder узлах.

Авторизация узлов в CDN

Авторизация узлов, которые пытаются подключиться к CDN, производится по IP-адресу. Адреса узлов, которые могут войти в CDN, должны быть указаны в следующей настройке

...

При этом транскодинг работает согласно настройке кодеков и SDP по принципам, определенным для CDN 2.0.

Ограничения

1. Не рекомендуется публиковать поток с одним и тем же именем на двух Origin серверах одной CDN

...

Code Block
languageyml
themeRDark
profiles:
 -240p:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 240
    bitrate : 400
    gop : 50
    fps : 25
    codec : h264
    codecImpl : OPENH264

2. Настройка качества кодирования не применяется при использовании OpenH264

Симптомы: качество картинки не изменяется при различных значениях quality в профиле транскодирования

Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается

Code Block
languageyml
themeRDark
profiles:
 -240p:
  audio:
    ...
  video:
    ...
    quality: 10
    codecImpl : FF