...
- MP4 для кодеков H.264 + AAC
- WebM для кодека кодеков VP8 + Vorbis
- WebM для кодеков H264 + opus (начиная со сборки 2.0.2001)
- TS для кодеков H.264 + ADTS
- MKV (начиная со сборки 5.2.1190)
...
Обратите внимание, что потоки, которые не содержат видео дорожки, всегда записываются в MP4 контейнер (кодек AAC).
Начиная со сборки 2.0.2001, для записи WebRTC потоков H264+opus поддерживается также контейнер WebM
Code Block | ||
---|---|---|
| ||
record_formats=h264-webm,vp8-webm |
Запись потоков в контейнер MPEG-TS
...
Если к ошибке привел определенный кадр в медиапотоке, этот и последующие кадры не будут записаны, до успешного получения очередного ключевого кадра.
Клиентская часть
При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра record, переданного функции createStream в скрипте публикующего клиента:
- true - поток, опубликованный с использованием этого клиента, будет записан;
- false - поток не будет записан.
Например, в скрипте веб-приложения Stream Recording recording.html, recording.js, содержится следующий код:
Code Block | ||||
---|---|---|---|---|
| ||||
function publishStream(session) {
var streamName = $('#url').val().split('/')[3];
session.createStream({
name: streamName,
display: localVideo,
record: true,
receiveVideo: false,
receiveAudio: false
...
}).publish();
} |
Запись потоков по требованию
В некоторых случаях, необходимо записать поток, который уже транслируется сервером, например, выходной поток микшера. Это можно сделать при помощи REST API. Обратите внимание, что только потоки в статусе "PUBLISHING" могут быть записаны.
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://streaming.flashphoner.com:8081/rest-api/recorder/startup
- HTTPS: https://streaming.flashphoner.com:8444/rest-api/recorder/startup
Здесь:
- streaming.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательный префикс
- /recorder/startup - используемый REST-вызов
REST-методы и статусы ответа
...
REST-метод
...
Пример тела REST-запроса
...
Пример тела REST-ответа
...
Статусы ответа
...
Описание
/stream/startRecording,
/recorder/startup
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"mediaSessionId": "5a072377-73c1-4caf-abd3",
"config": {
"fileTemplate": "{streamName}-{startTime}-{endTime}",
"rotation": "20M"
}
} |
404 - Not found
500 - Internal error
Начать запись потока в указанной медиасессии
...
/stream/stopRecording,
/recorder/terminate
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"mediaSessionId": "5a072377-73c1-4caf-abd3"
} |
...
404 - Not found
500 - Internal error
...
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"fileName": "9c3e-test-1563776083752-{endTime}.mp4",
"mediaSessionId": "5a072377-73c1-4caf-abd3"
}
] |
...
404 - Not found
500 - Internal error
...
Параметры
...
Имя параметра
...
Описание
...
Пример
...
mediaSessionId
...
Идентификатор сессии
...
5a072377-73c1-4caf-abd3
...
20M
Логика работы записи по требованию выглядит следующим образом:
- При вызове REST API /recorder/startup завершается текущая запись, если она идет в данный момент.
- Стартует новая запись, при этом применяются переданные через REST настройки.
- Если какая-либо из настроек не передана, применяется соответствующая настройка сервера.
...
Запись актуальных данных в заголовок MP4 контейнера
В сборке 5.2.1990 добавлена возможность периодической записи актуальных данных в заголовок MP4 контейнера
Code Block | ||
---|---|---|
| ||
mp4_container_moov_first_reserve_space=true
mp4_container_write_header_on_fly=true |
В этом случае данные заголовка периодически обновляются в соответствии с записанными в файл медиаданными. Период обновления задается настройкой в секундах
Code Block | ||
---|---|---|
| ||
mp4_container_write_header_on_fly_interval=5 |
Это позволяет проиграть записанный файл даже при внезапной остановке записи в случае ошибки. Данные будут доступны для проигрывания в соответствии с заголовком.
Ротация при заполнении заголовка MP4 контейнера
Начиная со сборки 5.2.2012, если во время записи заполняется MOOV атом в заголовке MP4 контейнера, запись автоматически ротируется по максимально допустимому объему данных. Например, при публикации потока 1920x1080 с битрейтом 3 Мбит/c, 30 fps и записи этого потока с настройками
Code Block | ||
---|---|---|
| ||
mp4_container_moov_first_reserve_space=true
mp4_container_moov_reserved_space_size=2048 |
длительность одной части составит около 22 минут, размер одной части около 510 Мб.
Клиентская часть
При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра record, переданного функции createStream в скрипте публикующего клиента:
- true - поток, опубликованный с использованием этого клиента, будет записан;
- false - поток не будет записан.
Например, в скрипте веб-приложения Stream Recording recording.html, recording.js, содержится следующий код:
Code Block | ||||
---|---|---|---|---|
| ||||
function publishStream(session) {
var streamName = $('#url').val().split('/')[3];
session.createStream({
name: streamName,
display: localVideo,
record: true,
receiveVideo: false,
receiveAudio: false
...
}).publish();
} |
Запись потоков по требованию
В некоторых случаях, необходимо записать поток, который уже транслируется сервером, например, выходной поток микшера. Это можно сделать при помощи REST API. Обратите внимание, что только потоки в статусе "PUBLISHING" могут быть записаны.
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://streaming.flashphoner.com:8081/rest-api/recorder/startup
- HTTPS: https://streaming.flashphoner.com:8444/rest-api/recorder/startup
Здесь:
- streaming.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательный префикс
- /recorder/startup - используемый REST-вызов
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
/stream/startRecording, /recorder/startup |
| 404 - Not found 500 - Internal error | Начать запись потока в указанной медиасессии | ||||||||
/stream/stopRecording, /recorder/terminate |
| 404 - Not found 500 - Internal error | Завершить запись потока в указанной медиасессии | ||||||||
/recorder/find_all |
|
...
|
...
|
...
REST запрос /recorder/find_all возвращает список сессий, записываемых в данный момент. В списке отражаются как записи по требованию, запущенные через REST API, так и записи, инициированные через WebSDK:
...
language | js |
---|---|
theme | RDark |
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
Получение имени записанного файла
Существуют следующие способы узнать имя записанного файла, например, для его скачивания:
1. На сервере имя файла получает скрипт обработки записанных файлов по окончании записи
2. Если имя файла необходимо знать в браузере, шаблон должен быть сформирован таким образом, чтобы в него входили параметры потока, которые могут быть получены при помощи REST API, например
Code Block | ||
---|---|---|
| ||
stream_record_policy_template={streamName}-{mediaSessionId} |
...
| 404 - Not found 500 - Internal error | Найти записываемые сессии |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
mediaSessionId | Идентификатор сессии | 5a072377-73c1-4caf-abd3 |
config | Настройки записи, имеют приоритет над настройками сервера | |
fileTemplate | Шаблон имени файла записи | {streamName}-{startTime}-{endTime} |
rotation | Включает/отключает ротацию файлов и способ нарезки (время или объем) | 20M |
Логика работы записи по требованию выглядит следующим образом:
- При вызове REST API /recorder/startup завершается текущая запись, если она идет в данный момент.
- Стартует новая запись, при этом применяются переданные через REST настройки.
- Если какая-либо из настроек не передана, применяется соответствующая настройка сервера.
Например, если необходимо передать точное имя файла для записи потока и отключить ротацию, должен быть передан запрос:
Code Block | ||||
---|---|---|---|---|
| ||||
/recorder/startup { "mediaSessionId":"1234567890abcdefgh", "config": { ... }).on(STREAM_STATUS.UNPUBLISHED, function (stream) { "fileTemplate": "test", "rotation": "disabled" } } |
REST запрос /recorder/find_all возвращает список сессий, записываемых в данный момент. В списке отражаются как записи по требованию, запущенные через REST API, так и записи, инициированные через WebSDK:
Code Block | ||||
---|---|---|---|---|
| ||||
[ { setStatus(stream.status());"fileName": "003f-1563776713987-{endTime}.mp4", showDownloadLink(stream.getRecordInfo()); "mediaSessionId": "5af9c820-ac49-11e9-9f06-693cb47c4042" }, onStopped(); }){ "fileName": "stream-57882100-ac49-11e9-afdd-6752f5be57a9-jtdvnittjkrd8rsc3dnfbger2o.mp4", "mediaSessionId": "57882100-ac49-11e9-afdd-6752f5be57a9" ... |
...
}
] |
Получение имени записанного файла
Существуют следующие способы узнать имя записанного файла, например, для его скачивания:
1. На сервере имя файла получает скрипт обработки записанных файлов по окончании записи
2. Если имя файла необходимо знать в браузере, шаблон должен быть сформирован таким образом, чтобы в него входили параметры потока, которые могут быть получены при помощи REST API, например
Code Block | ||
---|---|---|
| ||
stream_record_stoppolicy_timeout=15 |
Загрузка и воспроизведение записанного файла
Записанный файл доступен во встроенном веб-сервере WCS по прямой ссылке вида
template={streamName}-{mediaSessionId} |
3. При использовании WebSDK для записи потока, имя записанного файла можно получить при помощи функции getRecordInfo()
Code Block | ||||
---|---|---|---|---|
| ||||
https://test.flashphoner.com:8444/client/records/stream.mp4 |
Здесь
- test.flashphoner.com - URL WCS сервера
- stream.mp4 - имя записанного файла
По умолчанию, WCS возвращает заголовок
Code Block | ||
---|---|---|
| ||
Content-Disposition: inline;filename="stream.mp4" |
...
...
}).on(STREAM_STATUS.UNPUBLISHED, function (stream) {
setStatus(stream.status());
showDownloadLink(stream.getRecordInfo());
onStopped();
})
... |
Отметим, что при большом размере записи событие STREAM_STATUS.UNPUBLISHED может прийти через значительное время. В сборке 5.2.673 добавлена настройка, которая ограничивает интервал ожидания окончания записи (по умолчанию 15 секунд)
Code Block | ||
---|---|---|
| ||
record_response_content_disposition_header_value=inline |
...
stop_timeout=15 |
Загрузка и воспроизведение записанного файла
Записанный файл доступен во встроенном веб-сервере WCS по прямой ссылке вида
Code Block | ||
---|---|---|
| ||
record_response_content_disposition_header_value=attachment |
Загрузка и воспроизведение указанного фрагмента файла
В сборке 5.2.894 добавлена возможность загрузки и воспроизведения указанного фрагмента файла. Для этого необходимо запросить файл с указанием начали и конца фрагмента в секундах
Code Block | ||
---|---|---|
| ||
https:https://test.flashphoner.com:8444/client/records/stream.mp4?start=11&end=60 |
Может быть указано только время начала воспроизведения или только время конца.
Запрошенные фрагменты записываются в тот же каталог, где расположены файлы записей, с добавлением в имени времен начала и конца, например
Code Block | ||
---|---|---|
| ||
stream-s11-e60.mp4 |
После загрузки такие файлы не удаляются, если такой же фрагмент запрошен снова, сервер отправит уже существующий фрагмент.
Начиная со сборки 5.2.899, воспроизведение фрагментов поддерживается и для записей только с аудио.
Настройка каталога для размещения фрагментов
...
Здесь
- test.flashphoner.com - URL WCS сервера
- stream.mp4 - имя записанного файла
По умолчанию, WCS возвращает заголовок
Code Block | ||
---|---|---|
| ||
Content-Disposition: inline;filename="stream.mp4" |
в этом случае браузер попытается проиграть файл. Это поведение включается при помощи настройки
Code Block | ||
---|---|---|
| ||
/usr/local/FlashphonerWebCallServer/records |
(туда же, куда по умолчанию помещены записи).
...
record_response_content_disposition_header_value=inline |
Для того, чтобы браузер загружал записанный файл, не пытаясь его проиграть, необходимо установить настройку
Code Block | ||
---|---|---|
| ||
mp4_cutter_dir=/tmp |
Ограничения
1. Загрузка и воспроизведение фрагментов поддерживается только для MP4 контейнера. При запросе webm файла запись всегда загружается полностью.
2. При указании времени начала фрагмента, воспроизведение может начаться чуть раньше, в зависимости от расположения ключевого фрейма в файле.
Контроль записи потока на бэкенд сервере
В сборке 5.2.1416 добавлена возможность получения событий, сигнализирующих о том, что началась или завершилась запись потока. Для этого WCS отправляет на бэкенд сервер запрос /StreamEvent
Code Block | ||||
---|---|---|---|---|
| ||||
URL:http://localhost:8081/apps/EchoApp/StreamEvent
OBJECT:
{
"nodeId" : "d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.1.39",
"appKey" : "defaultApp",
"sessionId" : "/192.168.1.83:49977/192.168.1.39:8443-591009c4-e051-4722-b34d-71cf2ade3bed",
"mediaSessionId" : "15de2290-4089-11ed-88fe-d78a87cf3386",
"type" : "startedRecording",
"payload" : {
"fileName" : "stream-15de2290-4089-11ed-88fe-d78a87cf3386-8mv1of1o4fni58k0qdomu52kru.mp4"
}
} |
при старте записи и
Code Block | ||||
---|---|---|---|---|
| ||||
URL:http://localhost:8081/apps/EchoApp/StreamEvent OBJECT: { "nodeId" : "d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.1.39", "appKey" : "defaultApp", "sessionId" : "/192.168.1.83:49977/192.168.1.39:8443-591009c4-e051-4722-b34d-71cf2ade3bed", "mediaSessionId" : "15de2290-4089-11ed-88fe-d78a87cf3386", "type" : "stoppedRecordingrecord_response_content_disposition_header_value=attachment |
Загрузка и воспроизведение указанного фрагмента файла
В сборке 5.2.894 добавлена возможность загрузки и воспроизведения указанного фрагмента файла. Для этого необходимо запросить файл с указанием начали и конца фрагмента в секундах
Code Block | ||
---|---|---|
| ||
https://test.flashphoner.com:8444/client/records/stream.mp4?start=11&end=60 |
Может быть указано только время начала воспроизведения или только время конца.
Запрошенные фрагменты записываются в тот же каталог, где расположены файлы записей, с добавлением в имени времен начала и конца, например
Code Block | ||
---|---|---|
| ||
stream-s11-e60.mp4 |
После загрузки такие файлы не удаляются, если такой же фрагмент запрошен снова, сервер отправит уже существующий фрагмент.
Начиная со сборки 5.2.899, воспроизведение фрагментов поддерживается и для записей только с аудио.
Настройка каталога для размещения фрагментов
По умолчанию, фрагменты записываются в каталог
Code Block | ||
---|---|---|
| ||
/usr/local/FlashphonerWebCallServer/records |
(туда же, куда по умолчанию помещены записи).
В сборке 5.2.957 добавлена возможность указать отдельный каталог для фрагментов при помощи настройки
Code Block | ||
---|---|---|
| ||
mp4_cutter_dir=/tmp |
Ограничения
1. Загрузка и воспроизведение фрагментов поддерживается только для MP4 контейнера. При запросе webm файла запись всегда загружается полностью.
2. При указании времени начала фрагмента, воспроизведение может начаться чуть раньше, в зависимости от расположения ключевого фрейма в файле.
Контроль записи потока на бэкенд сервере
В сборке 5.2.1416 добавлена возможность получения событий, сигнализирующих о том, что началась или завершилась запись потока. Для этого WCS отправляет на бэкенд сервер запрос /StreamEvent
Code Block | ||||
---|---|---|---|---|
| ||||
URL:http://localhost:8081/apps/EchoApp/StreamEvent
OBJECT:
{
"nodeId" : "d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.1.39",
"appKey" : "defaultApp",
"sessionId" : "/192.168.1.83:49977/192.168.1.39:8443-591009c4-e051-4722-b34d-71cf2ade3bed",
"mediaSessionId" : "15de2290-4089-11ed-88fe-d78a87cf3386",
"type" : "startedRecording",
"payload" : {
"fileName" : "stream-15de2290-4089-11ed-88fe-d78a87cf3386-8mv1of1o4fni58k0qdomu52kru.mp4"
}
} |
при остановке записи.При обновлении WCS с предыдущих сборок в конфигурацию бэкенд приложения необходимо добавить метод StreamEvent
старте записи и
Code Block | ||||
---|---|---|---|---|
| ||||
add app-rest-method defaultApp StreamEvent
add app-rest-method MyAppKey StreamEvent |
Запись нескольких потоков в один файл с последующим микшированием
В сборке 5.2.1012 добавлена возможность записи нескольких потоков в один файл. В дальнейшем потоки могут быть извлечены из этого файла и смикшированы специальным инструментом. Несколько потоков могут быть записаны в MP4 контейнер или, начиная со сборки 5.2.1440, в MKV контейнер. Эта возможность предназначена, например, для записи видеоконференций. В отличие от MCU микшера, здесь микширование работает только при обработке уже записанного файла, и позволяет расходовать меньше ресурсов процессора непосредственно во время проведения конференции.
Запись нескольких потоков управляется по REST API.
Поддерживаемые кодеки
Контейнер MP4:
- H264
- AAC
Контейнер MKV:
- H264
- VP8
- Opus
- AAC
- PCMA
- PCMU
- G722
REST API для мультирекордера
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://streaming.flashphoner.com:8081/rest-api/multipleRecorder/startup
- HTTPS: https://streaming.flashphoner.com:8444/rest-api/multipleRecorder/startup
Здесь:
- streaming.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательный префикс
- /multipleRecorder/startup - используемый REST-вызов
REST-методы и статусы ответа
...
REST-метод
...
Пример тела REST-запроса
...
Пример тела REST-ответа
...
Статусы ответа
...
Описание
/multipleRecorder/startup
URL:http://localhost:8081/apps/EchoApp/StreamEvent
OBJECT:
{
"nodeId" : "d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.1.39",
"appKey" : "defaultApp",
"sessionId" : "/192.168.1.83:49977/192.168.1.39:8443-591009c4-e051-4722-b34d-71cf2ade3bed",
"mediaSessionId" : "15de2290-4089-11ed-88fe-d78a87cf3386",
"type" : "stoppedRecording",
"payload" : {
"fileName" : "stream-15de2290-4089-11ed-88fe-d78a87cf3386-8mv1of1o4fni58k0qdomu52kru.mp4"
}
} |
при остановке записи.
При обновлении WCS с предыдущих сборок в конфигурацию бэкенд приложения необходимо добавить метод StreamEvent
Code Block | ||||
---|---|---|---|---|
|
...
{
"uri": "multi-recorder://test-record"
}
409 - Conflict
500 - Internal error
...
Запустить рекордер для записи нескольких потоков
...
Code Block | ||||
---|---|---|---|---|
| ||||
{
"uri": "multi-recorder://test-record",
"mediaSessionId": "866a9910-fbfe-11eb-aae4-6f99b0c80a3a"
} |
...
404 - Not found
409 - Conflict
500 - Internal error
...
language | js |
---|---|
theme | RDark |
...
add app-rest-method defaultApp StreamEvent
add app-rest-method MyAppKey StreamEvent |
Запись нескольких потоков в один файл с последующим микшированием
В сборке 5.2.1012 добавлена возможность записи нескольких потоков в один файл. В дальнейшем потоки могут быть извлечены из этого файла и смикшированы специальным инструментом. Несколько потоков могут быть записаны в MP4 контейнер или, начиная со сборки 5.2.1440, в MKV контейнер. Эта возможность предназначена, например, для записи видеоконференций. В отличие от MCU микшера, здесь микширование работает только при обработке уже записанного файла, и позволяет расходовать меньше ресурсов процессора непосредственно во время проведения конференции.
Запись нескольких потоков управляется по REST API.
Поддерживаемые кодеки
Контейнер MP4:
- H264
- AAC
Контейнер MKV:
- H264
- VP8
- Opus
- AAC
- PCMA
- PCMU
- G722
REST API для мультирекордера
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://streaming.flashphoner.com:8081/rest-api/multipleRecorder/startup
- HTTPS: https://streaming.flashphoner.com:8444/rest-api/multipleRecorder/startup
Здесь:
- streaming.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательный префикс
- /multipleRecorder/startup - используемый REST-вызов
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/multipleRecorder/startup |
| ,
"fileName": "multi-recorder___test-record.mp4"
}
]404 - Not found 500 - Internal error | Найти все рекордеры
| 409 - Conflict 500 - Internal error | Запустить рекордер для записи нескольких потоков | |||||||||
/multipleRecorder/removeadd |
| 404 - Not found 409 - Conflict 500 - Internal error | Удалить Добавить в рекордер поток из рекордерауказанной медиасессии | |||||||||||
/multipleRecorder/terminatefind_all |
| 404 - Not found 500 - Internal error | Остановить рекордер |
Параметры
Имя параметра | Описание | Пример | |||
---|---|---|---|---|---|
uri | URI рекордера | filename | Имя файла, куда производится запись |
| |
mediaSessionId | Идентификатор медиасессии потока | 866a9910-fbfe-11eb-aae4-6f99b0c80a3a | |||
|
Выбор контейнера для записи
Данная возможность доступна, начиная со сборки 5.2.1440. По умолчанию, запись производится в контейнер MP4
Code Block | ||
---|---|---|
| ||
multi_recorder_type=MP4 |
При необходимости (например, при публикации VP8+Opus потоков в конференции), можно выбрать контейнер MKV
Code Block | ||
---|---|---|
| ||
multi_recorder_type=MKV |
Имя записываемого файла
Имя файла для записи нескольких потоков формируется по шаблону. При этом:
...
| 404 - Not found 500 - Internal error | Найти все рекордеры | |||||||||
/multipleRecorder/remove |
| 404 - Not found 500 - Internal error | Удалить поток из рекордера | ||||||||
/multipleRecorder/terminate |
| 404 - Not found 500 - Internal error | Остановить рекордер |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
uri | URI рекордера | multi-recorder://test-record |
mediaSessionId | Идентификатор медиасессии потока | 866a9910-fbfe-11eb-aae4-6f99b0c80a3a |
filename | Имя файла, куда производится запись | multi-recorder___test-record.mp4 |
Выбор контейнера для записи
Данная возможность доступна, начиная со сборки 5.2.1440. По умолчанию, запись производится в контейнер MP4
Code Block | ||
---|---|---|
| ||
multi_recorder_type=MP4 |
При необходимости (например, при публикации VP8+Opus потоков в конференции), можно выбрать контейнер MKV
Code Block | ||
---|---|---|
| ||
multi_recorder_type=MKV |
Имя записываемого файла
Имя файла для записи нескольких потоков формируется по шаблону. При этом:
1. Параметр {streamName} подставляется согласно URI рекордера, с заменой символов, не допустимых к использованию в именах файлов, на подчеркивания.
...
Извлечение отдельных потоков из MKV контейнера
В сборке 5.2.1440 с помощью инструмента для микширования записанных потоков можно извлечь отдельные потоки из MKV контейнера:5.2.1440 с помощью инструмента для микширования записанных потоков можно извлечь отдельные потоки из MKV контейнера:
Code Block | ||||
---|---|---|---|---|
| ||||
./offline_mixer_tool.sh --pull-streams ../records/multi-recorder___test-record.mkv |
При этом будут созданы MKV файлы для каждого из потоков:
Code Block | ||||
---|---|---|---|---|
| ||||
multi-recorder___test-record_fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c.mkv
multi-recorder___test-record_c7bc1460-20ee-11ec-bf06-ef6ec6048b2c.mkv
multi-recorder___test-record_ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c.mkv |
Если поток был удален из мультирекордера и повторно добавлен, или был добавлен позднее, чем другие потоки, получившиеся паузы по умолчанию будут заполнены, чтобы выровнять извлеченные потоки по времени. При необходимости, заполнение можно отключить
Code Block | ||
---|---|---|
| ||
multi_recorder_mkv_fill_gaps=false |
Скрипт для обработки записанных файлов
По окончании записи нескольких потоков в один файл, запускается cкрипт обработки, заданный настройкой
Code Block | ||
---|---|---|
| ||
on_multiple_record_hook_script=on_multiple_record_hook.sh |
По умолчанию, скрипт запускает offline_mixer_tool.sh
, передавая ему на вход имя записанного файла.
Начиная со сборки 5.2.1023, скрипт on_multiple_record_hook.sh
по умолчанию записывает в лог /usr/local/FlashphonerWebCallServer/logs/multi-record.log
только результат обработки, чтобы снизить нагрузку на диск во время работы инструмента микширования. При необходимости, можно включить подробное логирование для отладки, установив переменную в скрипте
Code Block | ||||
---|---|---|---|---|
| ||||
./offline_mixer_tool.sh --pull-streams ../records/multi-recorder___test-record.mkv |
...
LOGGER_ENABLED=true |
Многопоточное кодирование при микшировании записанных потоков
В сборке 5.2.1089 добавлена возможность включить многопоточное кодирование при микшировании записанных потоков. Для этого в файл /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json
необходимо добавить параметр
Code Block | ||||
---|---|---|---|---|
| ||||
multi-recorder___test-record_fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c.mkv
multi-recorder___test-record_c7bc1460-20ee-11ec-bf06-ef6ec6048b2c.mkv
multi-recorder___test-record_ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c.mkv |
Если поток был удален из мультирекордера и повторно добавлен, или был добавлен позднее, чем другие потоки, получившиеся паузы по умолчанию будут заполнены, чтобы выровнять извлеченные потоки по времени. При необходимости, заполнение можно отключить
Code Block | ||
---|---|---|
| ||
multi_recorder_mkv_fill_gaps=false |
Скрипт для обработки записанных файлов
По окончании записи нескольких потоков в один файл, запускается cкрипт обработки, заданный настройкой
Code Block | ||
---|---|---|
| ||
on_multiple_record_hook_script=on_multiple_record_hook.sh |
По умолчанию, скрипт запускает offline_mixer_tool.sh
, передавая ему на вход имя записанного файла.
...
{
...,
"multithreading": true
} |
При использовании многопоточного кодирования записанные потоки микшируются в среднем в два раза быстрее по сравнению с однопоточным.
Количество процессорных потоков при многопоточном кодировании
В сборке 5.2.1523 добавлена настройка количества процессорных потоков, используемых для многопоточного кодирования. По умолчанию, количество процессорных потоков равно половине доступных системе ядер CPU. Например, на сервере с 12 CPU по умолчанию буду использовать 6 потоков
Code Block | ||||
---|---|---|---|---|
| ||||
{
...,
"threadCount": 6
} |
Если микширование записе занимает долгое время, значение можно увеличить, но не рекомедуется указывать больше, чем количество ядер CPU на сервере, которое можно определить при помощи команды
Code Block | ||||
---|---|---|---|---|
| ||||
lscpu | grep -E "^CPU\(s\)" |
Отображение имени записанного потока
По умолчанию, в микшированной записи нескольких потоков отображается имя каждого потока. При необходимости, это можно отключить настройкой в файле /usr/local/FlashphonerWebCallServer/logs/multi-record.log
только результат обработки, чтобы снизить нагрузку на диск во время работы инструмента микширования. При необходимости, можно включить подробное логирование для отладки, установив переменную в скриптеconf/offline_mixer.json
Code Block | ||||
---|---|---|---|---|
| ||||
LOGGER_ENABLED=true |
Многопоточное кодирование при микшировании записанных потоков
{
...,
"mixerDisplayStreamName": false
} |
При записи потоков в конференции с использованием RoomApi, имя потока включает имя комнаты конференции и идентификатор потока участника, например room-1882a6-bob-037c
. В сборке 5.2.10891642 добавлена возможность включить многопоточное кодирование при микшировании записанных потоков. Для этого в файл /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json
необходимо добавить параметрисключить имя комнаты при помощи настроек
Code Block | ||||
---|---|---|---|---|
| ||||
{ ...{ ..., "mixerDisplayStreamName": true, "mixerTextDisplayRoom": false, "labelReplaceRegex": "\\w+-\\w+-([^\\-]+)-\\w+", "multithreadinglabelReplaceWith": true"" } |
При использовании многопоточного кодирования записанные потоки микшируются в среднем в два раза быстрее по сравнению с однопоточным.
Количество процессорных потоков при многопоточном кодировании
...
Здесь:
- labelReplaceRegex - регулярное выражение для замены элементов в имени потока
- labelReplaceWith - строка, которая должна заменить элементы, найденные по регулярному выражению, пустая строка исключает найденные элементы
В этом случае для указанного выше примера будет отображаться только имя участника bob.
Декодирование символов в имени записанного потока
В сборке 5.2.1751 добавлена возможность декодирования символов в имени потока, закодированных на стороне клиента при помощи encodeURIComponent()
Code Block | ||||
---|---|---|---|---|
| ||||
{ ..., "threadCountmixerDecodeStreamName": 6true } |
Если микширование записе занимает долгое время, значение можно увеличить, но не рекомедуется указывать больше, чем количество ядер CPU на сервере, которое можно определить при помощи команды
...
language | bash |
---|---|
theme | RDark |
...
В этом случае в изображении будут отображаться декодированные символы, если такие символы есть в используемом шрифте, или близкие к ним по начертанию.
Отправка данных о завершении записи нескольких потоков
...