...
Параметр | Допустимые значения | Описание |
---|---|---|
Параметры аудио | ||
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 | ||||
---|---|---|---|---|
| ||||
{
"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
...
Добавить профиль транскодинга
...
language | js |
---|---|
theme | RDark |
...
Поддержка нескольких каналов звука
Начиная со сборки 5.2.773, поддерживается транскодирование звука по профилю с указанием количества каналов (1 - моно, 2 - стерео)
Code Block | ||||
---|---|---|---|---|
| ||||
profiles:
-240p:
audio:
codec : mpeg4-generic
rate : 48000
channels: 1
video:
height : 240
bitrate : 300
gop : 50
codec : h264 |
Для того, чтобы подписчик на Edge сервере мог играть стерео звук при публикации потока со стерео звуком, количество каналов в профиле должно соответствовать количеству каналов в оригинальном потоке, т.е.
Code Block | ||||
---|---|---|---|---|
| ||||
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-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/cdn/profile/add |
| video
| 400
| quality
| 25
| }
}
}200 – OK 400 - Bad Request 404 - Not Found 500 – Internal Server Error | Изменить профиль транскодинга | /cdn/profile/print | |||||||||||||
Code Block | |||||||||||||||||||||
|
| audio
| bitrate
| 0
| channels
| opus
| rate
| 48000
| type
| "audio"
|
| },
|
| video
| {
| bitrate
| 0
| codec
| "h264"
| codecImpl
| "FF",
| "fps": 25,
"gop": 50,
| 200 – OK 400 - Bad Request 409 - Conflict 500 – Internal Server Error | Добавить профиль транскодинга |
/cdn/profile/modify |
| 200 – OK 400 - Bad Request 404 - Not Found 500 – Internal Server Error | Изменить профиль транскодинга | ||||||||||||||||||
/cdn/profile/print |
| 200 – OK 404 - Not Found 500 – Internal Server Error | Получить список профилей транскодирования | /cdn/profile/remove |
Code Block | ||||
---|---|---|---|---|
| ||||
{
"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 | ||||
---|---|---|---|---|
| ||||
{
"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 | ||||
---|---|---|---|---|
| ||||
profile1:
audio:
codec : opus
rate : 48000
video:
width : 320
height : 180
gop : 90
fps : 30
codec : h264 |
поток будет транскодирован в 320x240 (4:3).
В этом случае можно не указывать ширину кадра в профиле транскодирования, поскольку ширина будет выбрана, исходя из соотношения сторон. Например, допускается такой профиль
Code Block | ||||
---|---|---|---|---|
| ||||
profile3:
audio:
codec : opus
rate : 48000
video:
height : 180 |
Настройка транскодеров для работы в условиях больших нагрузок
При транскодинге большого количества потоков на сервере возрастает нагрузка на процессор сервера. Если процессор не успевает обрабатывать кадры всех потоков, очереди кадров на кодирование занимают оперативную память сервера (не JVM heap!). В зависимости от используемых в системе библиотек распределения памяти (malloc) это может приводить к утечкам памяти и, как следствие, к остановке сервера.
Чтобы избежать этого, предусмотрены следующие настройки, которые рекомендуется использовать совместно:
- приостановка декодирования входящих потоков, если очереди на кодирование переполнены
- использование библиотеки jemalloc
Приостановка декодирования входящих потоков
Приостановка декодирования входящих потоков дает возможность сгладить (но не ликвидировать) пиковые нагрузки на сервер, при условии выставления этих настроек для группы транскодеров, и включается при помощи следующего параметра
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors=true |
Размер очереди, по достижении которого декодирование приостанавливается, задается в кадрах следующей настройкой
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors_max_queue_size=3 |
Интервал ожидания освобождения очереди задается в миллисекундах
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors_timeout=33 |
Использование библиотеки jemalloc для распределения памяти
По умолчанию, в большинстве случаев используется библиотека распределения памяти, входящая в состав glibc. Чтобы избежать утечек памяти под большими нагрузками, рекомендуется переключить Transcoder узлы на использование библиотеки jemalloc следующим образом (на примере Centos 7):
1. Установить компоненты, необходимые для сборки
Code Block | ||||
---|---|---|---|---|
| ||||
yum -y install autoconf libtool pkg-config g++ make cmake bzip |
2. Скачать исходный код библиотеки
Code Block | ||||
---|---|---|---|---|
| ||||
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2 |
3. Распаковать архив
Code Block | ||||
---|---|---|---|---|
| ||||
tar -xvjf jemalloc-5.2.1.tar.bz2 |
4. Собрать библиотеку
Code Block | ||||
---|---|---|---|---|
| ||||
cd jemalloc-5.2.1
./configure && make && make install |
5. В файле /usr/local/FlashphonerWebCallServer/bin/setenv.sh закомментировать следующую строку
Code Block | ||||
---|---|---|---|---|
| ||||
export MALLOC_ARENA_MAX=4 |
и добавить следующую строку
Code Block | ||||
---|---|---|---|---|
| ||||
export LD_PRELOAD=/usr/local/lib/libjemalloc.so |
6. В файле настроек flashphoner.properties переключить используемый декодер на OpenH264
Code Block | ||
---|---|---|
| ||
decoder_priority=OPENH264,FF |
...
| 200 – OK 404 - Not Found 500 – Internal Server Error | Получить список профилей транскодирования | |||||||||
/cdn/profile/remove |
| 200 – OK 404 - Not Found 500 – Internal Server Error | Удалить профиль транскодирования |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
name | Имя профиля | -profile1 |
profile | Параметры профиля | { |
Параметры профиля обязательно должны содержать разделы audio
или video
.
Основными параметрами профиля являются следующие:
- audio:
- bitrate
- codec
- rate
- video:
- bitrate
- codec
- width
- height
- quality
Если какие-либо из этих параметров не указаны при создании профиля, они будут добавлены в профиль со значением 0 для числовых и "" для строковых параметров, при этом будут применены значения по умолчанию.
Остальные параметры являются дополнительными и могут отсутствовать в профиле:
- video:
- codecImpl
- fps
- gop
- level
- preset
- profile
При изменении профиля изменяются только переданные параметры. Для сброса какого-либо из основных параметров к значению по умолчанию, либо для удаления из профиля дополнительного параметра необходимо передать -1, например:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"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 | ||||
---|---|---|---|---|
| ||||
profile1:
audio:
codec : opus
rate : 48000
video:
width : 320
height : 180
gop : 90
fps : 30
codec : h264 |
поток будет транскодирован в 320x240 (4:3).
В этом случае можно не указывать ширину кадра в профиле транскодирования, поскольку ширина будет выбрана, исходя из соотношения сторон. Например, допускается такой профиль
Code Block | ||||
---|---|---|---|---|
| ||||
profile3:
audio:
codec : opus
rate : 48000
video:
height : 180 |
Настройка транскодеров для работы в условиях больших нагрузок
При транскодинге большого количества потоков на сервере возрастает нагрузка на процессор сервера. Если процессор не успевает обрабатывать кадры всех потоков, очереди кадров на кодирование занимают оперативную память сервера (не JVM heap!). В зависимости от используемых в системе библиотек распределения памяти (malloc) это может приводить к утечкам памяти и, как следствие, к остановке сервера.
Чтобы избежать этого, предусмотрены следующие настройки, которые рекомендуется использовать совместно:
- приостановка декодирования входящих потоков, если очереди на кодирование переполнены
- использование библиотеки jemalloc
Приостановка декодирования входящих потоков
Приостановка декодирования входящих потоков дает возможность сгладить (но не ликвидировать) пиковые нагрузки на сервер, при условии выставления этих настроек для группы транскодеров, и включается при помощи следующего параметра
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors=true |
Размер очереди, по достижении которого декодирование приостанавливается, задается в кадрах следующей настройкой
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors_max_queue_size=3 |
Интервал ожидания освобождения очереди задается в миллисекундах
Code Block | ||
---|---|---|
| ||
streaming_video_decoder_wait_for_distributors_timeout=33 |
Использование библиотеки jemalloc для распределения памяти
По умолчанию, в большинстве случаев используется библиотека распределения памяти, входящая в состав glibc. Чтобы избежать утечек памяти под большими нагрузками, рекомендуется переключить Transcoder узлы на использование библиотеки jemalloc следующим образом (на примере Centos 7):
1. Установить компоненты, необходимые для сборки
Code Block | ||||
---|---|---|---|---|
| ||||
yum -y install autoconf libtool pkg-config g++ make cmake bzip |
2. Скачать исходный код библиотеки
Code Block | ||||
---|---|---|---|---|
| ||||
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2 |
3. Распаковать архив
Code Block | ||||
---|---|---|---|---|
| ||||
tar -xvjf jemalloc-5.2.1.tar.bz2 |
4. Собрать библиотеку
Code Block | ||||
---|---|---|---|---|
| ||||
cd jemalloc-5.2.1
./configure && make && make install |
5. В файле /usr/local/FlashphonerWebCallServer/bin/setenv.sh закомментировать следующую строку
Code Block | ||||
---|---|---|---|---|
| ||||
export MALLOC_ARENA_MAX=4 |
и добавить следующую строку
Code Block | ||||
---|---|---|---|---|
| ||||
export LD_PRELOAD=/usr/local/lib/libjemalloc.so |
6. В файле настроек flashphoner.properties переключить используемый декодер на OpenH264
Code Block | ||
---|---|---|
| ||
decoder_priority=OPENH264,FF |
7. Перезапустить WCS.
Снижение порога многопоточного кодирования
По умолчанию, многопоточное кодирование включается для профилей 720p. В некоторых случая необходимо снизить этот порог, чтобы кодировать по профилям 480p также в два и более потоков
Code Block | ||
---|---|---|
| ||
video_encoder_second_thread_threshold=408950 |
Уменьшение количества выделений памяти при декодировании
Для уменьшения количества выделений памяти при декодировании в сборке 5.2.559 добавлена возможность использования пула буферов для декодированных картинок. Эта возможность включается настройкой
Code Block | ||
---|---|---|
| ||
decoder_buffer_pool=true |
В этом случае под каждое разрешение картинки выделяется пул буферов. По окончании использования буфера, он не удаляется, а возвращается в пул. Чтобы получить информацию об использовании памяти, необходимо включить вывод статистики при помощи настройки
Code Block | ||
---|---|---|
| ||
decoder_buffer_pool_stats=true |
Статистика доступна по запросу (только в формате JSON)
Code Block | ||||
---|---|---|---|---|
| ||||
curl -s 'http://localhost:8081/?action=stat&format=json&groups=decoder_buffer_pool_stats' |
и сгруппирована по пулам
Code Block | ||||
---|---|---|---|---|
| ||||
{
"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 | Сжать пулы буферов декодирования |
Транскодирование по двум и более профилям с одинаковыми параметрами видео
...
Code Block | ||||
---|---|---|---|---|
| ||||
-240p-HLS: audio: codec: mpeg4-generic video: height: 240 bitrate: 300 codec: h264 -240p-WebRTC: audio: codec: opus video: height: 240 bitrate: 300 codec: h264h264 |
В этом случае, если поток транскодируется на одном и том же Transcoder узле по двум таким профилям, будет использован один кодировщик видео и два кодировщика аудио.
Предотвращение транскодирования к более высоким разрешениям
В сборке 5.2.607 добавлена возможность избежать транскодирования потока к более высоким разрешениям. Эта возможность включается при помощи настройки
Code Block | ||
---|---|---|
| ||
cdn_strict_transcoding_boundaries=true |
В этом случае, если поток транскодируется на одном и том же Transcoder узле по двум таким профилям, будет использован один кодировщик видео и два кодировщика аудиос Edge сервера запросить поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge получит оригинальный поток напрямую с Origin без транскодирования. Сравнение разрешений производится по высоте.
При необходимости, можно запретить запрашивать c Edge поток по профилям с более высоким разрешением при помощи параметра
Code Block | ||
---|---|---|
| ||
cdn_strict_transcoding_throws_exception=true |
Тогда при попытке запросить с Edge поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge не сможет выбрать маршрут для воспроизведения потока, и клиент получит ошибку.
Эти настройки должны указываться на Edge сервере.
Ограничения
1. Если транскодирование к более высоким разрешениям запрещено, в настройках профиля транскодирования обязательно должна быть указана высота.
Выбор маршрута для воспроизведения потока
...
Code Block | ||||
---|---|---|---|---|
| ||||
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes { "streamName": "test-webrtc-pcma-video-proxy" } |
получаем:1. Запрашиваемый профиль:
1. Запрашиваемый профиль:
Code Block | ||||
---|---|---|---|---|
| ||||
"REQUESTED-PROFILE": [
"AUDIO{bitrate=0, codec='pcma', rate=8000, channels=1}"
], |
2. На Transcoder создан профиль транскодирования:
Code Block | ||||
---|---|---|---|---|
| ||||
"REQUESTED1-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='null', quality=null}", "AUDIO{bitrate=0, codec='pcmaPCMA', rate=8000, channels=1}" ], |
23. На Transcoder создан профиль транскодирования:Поток захватывается через Transcoder
Code Block | ||||
---|---|---|---|---|
| ||||
"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 | ||||
---|---|---|---|---|
| ||||
"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}", ] |
Воспроизведение потока с Transcoder с транскодингом видео
Воспроизводим поток test на Edge по профилю
Code Block | ||||
---|---|---|---|---|
| ||||
-opus-vp8: audio: codec : opus rate : "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}" ], "3-NEW-TRANSCODER-192.168.1.220": [], |
4. Параметры публикации потока на Origin:
Code Block | ||||
---|---|---|---|---|
| ||||
"3-PROXY-192.168.1.219": [48000 channels : 2 video: width : 320 height : 240 gop : 60 "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}", fps : 30 codec : vp8 "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}" ] |
Воспроизведение потока с Transcoder с транскодингом видео
...
codecImpl : FF |
В ответ на запрос
Code Block | ||||
---|---|---|---|---|
| ||||
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes
{
"streamName": "test-webrtc-opus-vp8"
} |
получаем:
1. Запрашиваемый профиль:
Code Block | ||||
---|---|---|---|---|
| ||||
-opus-vp8: audio: "REQUESTED-PROFILE": [ codec : opus "AUDIO{bitrate=0, codec='opus', rate : 48000 channels : 2=48000, channels=2}", video: width : 320 height : 240 gop : 60 fps : 30 codec : vp8 codecImpl : FF |
В ответ на запрос
Code Block | ||||
---|---|---|---|---|
| ||||
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes
{
"streamName": "test-webrtc-opus-vp8"
} |
получаем:
...
"VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='vp8', codecImpl='FF', quality=null}"
], |
2. На Transcoder создан профиль транскодирования:
Code Block | ||||
---|---|---|---|---|
| ||||
"REQUESTED1-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 | ||||
---|---|---|---|---|
| ||||
"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}" ], |
...
, quality=null}"
],
"3-NEW-TRANSCODER-192.168.1.220": [], |
4. Параметры публикации потока на Origin:
Code Block | ||||
---|---|---|---|---|
| ||||
"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 | ||||
---|---|---|---|---|
| ||||
"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 | ||
---|---|---|
| ||
cdn_advertise_streams_by_kframe=true |
Отметим, что аудио потоки (без видеодорожки) не будут доступны в CDN при такой настройке, поскольку не содержат ключевых кадров.
Распределение нагрузки по Transcoder узлам
Определение загрузки узла, исходя из загрузки процессора
Если в CDN входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкой
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
cdn_transcoder_video_encoders_threshold=10000 |
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED. Учитываются все кодировщики на сервере, например, если один поток транскодируется по двум профилям, будет использовано 3 кодировщика, включая кодировщик PNG.
Настройка должна задаваться на Transcoder узлах
Ограничение общей нагрузки на декодирование
В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на декодирование потоков. Например, для того, чтобы разрешить декодирование не более чем 20 потоков 1080p 30 fps, необходимо установить следующее значение
Code Block | ||
---|---|---|
| ||
cdn_advertisetranscoder_video_streamsdecoders_byload_kframethreshold=true1244160000 |
Отметим, что аудио потоки (без видеодорожки) не будут доступны в CDN при такой настройке, поскольку не содержат ключевых кадров.
Распределение нагрузки по Transcoder узлам
Определение загрузки узла, исходя из загрузки процессора
Если в CDN входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкойчто соответствует произведению
Code Block | ||
---|---|---|
| ||
cdn_node_load_average_threshold=1.0 |
Эта величина задает соотношение между средней загрузкой процессора (параметр JVM SystemLoadAverage) и количеством процессорных ядер с учетом гипертрединга. Если значение превышено, Transcoder перестает участвовать в выборе маршрута для новых потоков и профилей. При этом в секции PROFILE данный узел отображается в маршрутах потока для тех профилей, по которым уже транскодируется этот поток.
...
1920 * 1080 * 30 * 20 |
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED.
Настройка должна задаваться на Transcoder узлах.
Ограничение общей нагрузки на кодирование
В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на кодирование потоков. Например, для того, чтобы разрешить кодирование не более чем 20 потоков 720p, 480p и 240p 25 fps, необходимо установить следующее значение
Code Block | ||
---|---|---|
| ||
cdn_transcoder_video_encoders_load_threshold=716400000 |
что соответствует сумме
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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_STREAMS_STREAMS_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 | ||
---|---|---|
| ||
cdn_nodes_state_refresh_interval=60000 |
По умолчанию, периодичность рассылки составляет 60 секунд. Для Transcoder узлов рекомендуется уменьшить это значение до 1 секунды, чтобы своевременно распределять потоки на другие узлы.
Настройка состояния Transcoder узла при достижении ограничений по производительности
В сборке 5.2.640 добавлена настройка, позволяющая указать состояние, в которое перейдет Transcoder узел при достижении любого из ограничений, по умолчанию GROUP_CONNECTIONS_ALLOWED
Code Block | ||
---|---|---|
| ||
cdn_transcoder_threshold_state=GROUP_CONNECTIONS_ALLOWED |
...
При необходимости, чтобы предотвратить размазывание потока по CDN, можно переводить Transcoder в состояние CONNECTIONS_ALLOWED
Code Block | ||
---|---|---|
| ||
cdn_nodestranscoder_threshold_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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
profiles:
-240p:
audio:
...
video:
...
quality: 10
codecImpl : FF |