Versions Compared

Key

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

...

  • 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
themeRDark
record_formats=h264-webm,vp8-webm

Запись потоков в контейнер MPEG-TS

...

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

Клиентская часть

При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра record, переданного функции createStream в скрипте публикующего клиента:

  • true - поток, опубликованный с использованием этого клиента, будет записан;
  • false - поток не будет записан.

Например, в скрипте веб-приложения Stream Recording recording.htmlrecording.js, содержится следующий код:

Code Block
languagejs
themeRDark
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
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3",
  "config": {
    "fileTemplate": "{streamName}-{startTime}-{endTime}",
    "rotation": "20M"
  }
}

404 - Not found

500 - Internal error

Начать запись потока в указанной медиасессии

...

/stream/stopRecording,

/recorder/terminate

...

Code Block
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3"
}

...

404 - Not found

500 - Internal error

...

Code Block
languagejs
themeRDark
[
    {
        "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 настройки.
  • Если какая-либо из настроек не передана, применяется соответствующая настройка сервера.

Например, если необходимо передать точное имя файла для записи потока и отключить ротацию, должен быть передан запрос:

Code Block
languagejs
themeRDark
/recorder/startup
{
  "mediaSessionId":"1234567890abcdefgh",
  "config": {
    "fileTemplate": "test",
    "rotation": "disabled"
  }
}

REST запрос /recorder/find_all возвращает список сессий, записываемых в данный момент. В списке отражаются как записи по требованию, запущенные через REST API, так и записи, инициированные через WebSDK:

Code Block
languagejs
themeRDark
[
    {
        "fileName": "003f-1563776713987-{endTime}.mp4", 
        "mediaSessionId": "5af9c820-ac49-11e9-9f06-693cb47c4042"
    }, 
    {
        "fileName": "stream-57882100-ac49-11e9-afdd-6752f5be57a9-jtdvnittjkrd8rsc3dnfbger2o.mp4", 
        "mediaSessionId": "57882100-ac49-11e9-afdd-6752f5be57a9"
    }
]

Получение имени записанного файла

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

1. На сервере имя файла получает скрипт обработки записанных файлов по окончании записи

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

Code Block
themeRDark
stream_record_policy_template={streamName}-{mediaSessionId}

...

Запись актуальных данных в заголовок MP4 контейнера

В сборке 5.2.1990 добавлена возможность периодической записи актуальных данных в заголовок MP4 контейнера

Code Block
themeRDark
mp4_container_moov_first_reserve_space=true
mp4_container_write_header_on_fly=true

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

Code Block
themeRDark
mp4_container_write_header_on_fly_interval=5

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

Ротация при заполнении заголовка MP4 контейнера

Начиная со сборки 5.2.2012, если включено резервирование места под заголовок MP4 файла, и во время записи заполняется MOOV атом в заголовке, запись автоматически ротируется по максимально допустимому объему данных. Например, при публикации потока 1920x1080 с битрейтом 3 Мбит/c, 30 fps и записи этого потока с настройками

Code Block
themeRDark
mp4_container_moov_first_reserve_space=true
mp4_container_moov_reserved_space_size=2048

длительность одной части составит около 22 минут, размер одной части около 510 Мб.

Запись данных в заголовок MP4 контейнера без резервирования места в файле

При длительной записи, требуется резервирование значительных объемов свободного места под заголовок MP4 файла. Например, для записи 1080p потока в течение одного часа потребуется зарезервировать более 5 Мб под заголовок, и при более коротких записях в заголовке останется незаполненное место. В связи с этим, в сборке 5.2.2020 процесс записи актуальных данных в заголовок MP4 контейнера был изменен. С настройкой

Code Block
themeRDark
mp4_container_write_header_on_fly=true

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

Code Block
languagebash
themeRDark
-rw-r--r-- 1 flashphoner flashphoner  45293 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.header
-rw-r--r-- 1 flashphoner flashphoner 924777 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.tmp

В файл с расширением .header записываются данные заголовка, в файл .tmp - медиаданные. По окончании записи файлы объединяются

Code Block
languagebash
themeRDark
-rw-r--r-- 1 flashphoner flashphoner 1930149 Jul 15 09:58 test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4

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

Code Block
languagebash
themeRDark
cat test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.header test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4.tmp > test-f6a0c740-4255-11ef-af8d-e781f7a0d3ed.mp4

Клиентская часть

При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра record, переданного функции createStream в скрипте публикующего клиента:

  • true - поток, опубликованный с использованием этого клиента, будет записан;
  • false - поток не будет записан.

Например, в скрипте веб-приложения Stream Recording recording.htmlrecording.js, содержится следующий код:

Code Block
languagejs
themeRDark
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
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3",
  "config": {
    "fileTemplate": "{streamName}-{startTime}-{endTime}",
    "rotation": "20M"
  }
}

404 - Not found

500 - Internal error


Начать запись потока в указанной медиасессии


/stream/stopRecording,

/recorder/terminate

Code Block
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3"
}

404 - Not found

500 - Internal error

Завершить запись потока в указанной медиасессии
/recorder/find_all
Code Block
languagejs
themeRDark

...

[
    

...

{
       

...

 "fileName": "9c3e-test-1563776083752-{endTime}.mp4", 
        

...

"mediaSessionId": "5a072377-73c1-4caf-abd3"
    }

...

Отметим, что при большом размере записи событие STREAM_STATUS.UNPUBLISHED может прийти через значительное время. В сборке 5.2.673 добавлена настройка, которая ограничивает интервал ожидания окончания записи (по умолчанию 15 секунд)

Code Block
themeRDark
record_stop_timeout=15

Загрузка и воспроизведение записанного файла

Записанный файл доступен во встроенном веб-сервере WCS по прямой ссылке вида

Code Block
themeRDark
https://test.flashphoner.com:8444/client/records/stream.mp4

Здесь

  • test.flashphoner.com - URL WCS сервера
  • stream.mp4 - имя записанного файла

По умолчанию, WCS возвращает заголовок

Code Block
themeRDark
Content-Disposition: inline;filename="stream.mp4"

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

Code Block
themeRDark
record_response_content_disposition_header_value=inline

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

Code Block
themeRDark
record_response_content_disposition_header_value=attachment

Загрузка и воспроизведение указанного фрагмента файла

В сборке 5.2.894 добавлена возможность загрузки и воспроизведения указанного фрагмента файла. Для этого необходимо запросить файл с указанием начали и конца фрагмента в секундах

Code Block
themeRDark
https://test.flashphoner.com:8444/client/records/stream.mp4?start=11&end=60

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

Запрошенные фрагменты записываются в тот же каталог, где расположены файлы записей, с добавлением в имени времен начала и конца, например

Code Block
themeRDark
stream-s11-e60.mp4

После загрузки такие файлы не удаляются, если такой же фрагмент запрошен снова, сервер отправит уже существующий фрагмент.

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

Настройка каталога для размещения фрагментов

По умолчанию, фрагменты записываются в каталог

Code Block
themeRDark
/usr/local/FlashphonerWebCallServer/records

(туда же, куда по умолчанию помещены записи).

В сборке 5.2.957 добавлена возможность указать отдельный каталог для фрагментов при помощи настройки

Code Block
themeRDark
mp4_cutter_dir=/tmp

Ограничения

1. Загрузка и воспроизведение фрагментов поддерживается только для MP4 контейнера. При запросе webm файла запись всегда загружается полностью.

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

Контроль записи потока на бэкенд сервере

В сборке 5.2.1416 добавлена возможность получения событий, сигнализирующих о том, что началась или завершилась запись потока. Для этого WCS отправляет на бэкенд сервер запрос /StreamEvent  

Code Block
languagejs
themeRDark
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
languagejs
themeRDark
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
languagejs
themeRDark
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-методы и статусы ответа

/multipleRecorder/startup

409 - Conflict

500 - Internal error

REST-метод

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

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

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

Описание

Code Block
languagejs
themeRDark
{
 "uri": "multi-recorder://test-record"
}

Запустить рекордер для записи нескольких потоков

/multipleRecorder/add
Code Block
languagejs
themeRDark
{
 "uri": "multi-recorder://test-record",
 "mediaSessionId": "866a9910-fbfe-11eb-aae4-6f99b0c80a3a"
}

404 - Not found

409 - Conflict

500 - Internal error

Добавить в рекордер поток из указанной медиасессии/multipleRecorder/find_all
Code Block
languagejs
themeRDark
[
  {
    "mediaSessionsId": [
      "866a9910-fbfe-11eb-aae4-6f99b0c80a3a",
      "9f1e2530-fbfe-11eb-9ec1-77172ac14d86",
      "a970d0a0-fbfe-11eb-8fcc-912807bab442"
    ],
    "uri": "multi-recorder://test-record",
    "fileName": "multi-recorder___test-record.mp4"
  }
]

404 - Not found

500 - Internal error

Найти все рекордеры/multipleRecorder/remove

]

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
languagejs
themeRDark
/recorder/startup
{
  "mediaSessionId":"1234567890abcdefgh",
  "config": {
    "fileTemplate": "test",
    "rotation": "disabled"
  }
}

REST запрос /recorder/find_all возвращает список сессий, записываемых в данный момент. В списке отражаются как записи по требованию, запущенные через REST API, так и записи, инициированные через WebSDK:

Code Block
languagejs
themeRDark
[
    {
        "fileName": "003f-1563776713987-{endTime}.mp4", 
        "mediaSessionId": "5af9c820-ac49-11e9-9f06-693cb47c4042"
    }, 
    {
        "fileName": "stream-57882100-ac49-11e9-afdd-6752f5be57a9-jtdvnittjkrd8rsc3dnfbger2o.mp4", 
        "mediaSessionId": "57882100-ac49-11e9-afdd-6752f5be57a9"
    }
]

Получение имени записанного файла

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

1. На сервере имя файла получает скрипт обработки записанных файлов по окончании записи

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

Code Block
themeRDark
stream_record_policy_template={streamName}-{mediaSessionId}

3. При использовании WebSDK для записи потока, имя записанного файла можно получить при помощи функции getRecordInfo()

Code Block
languagejs
themeRDark
    ...
    }).on(STREAM_STATUS.UNPUBLISHED, function (stream) {
        setStatus(stream.status());
        showDownloadLink(stream.getRecordInfo());
        onStopped();
    })
    ...

Отметим, что при большом размере записи событие STREAM_STATUS.UNPUBLISHED может прийти через значительное время. В сборке 5.2.673 добавлена настройка, которая ограничивает интервал ожидания окончания записи (по умолчанию 15 секунд)

Code Block
themeRDark
record_stop_timeout=15

Загрузка и воспроизведение записанного файла

Записанный файл доступен во встроенном веб-сервере WCS по прямой ссылке вида

Code Block
themeRDark
https://test.flashphoner.com:8444/client/records/stream.mp4

Здесь

  • test.flashphoner.com - URL WCS сервера
  • stream.mp4 - имя записанного файла

По умолчанию, WCS возвращает заголовок

Code Block
themeRDark
Content-Disposition: inline;filename="stream.mp4"

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

Code Block
themeRDark
record_response_content_disposition_header_value=inline

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

Code Block
themeRDark
record_response_content_disposition_header_value=attachment

Загрузка и воспроизведение указанного фрагмента файла

В сборке 5.2.894 добавлена возможность загрузки и воспроизведения указанного фрагмента файла. Для этого необходимо запросить файл с указанием начали и конца фрагмента в секундах

Code Block
themeRDark
https://test.flashphoner.com:8444/client/records/stream.mp4?start=11&end=60

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

Запрошенные фрагменты записываются в тот же каталог, где расположены файлы записей, с добавлением в имени времен начала и конца, например

Code Block
themeRDark
stream-s11-e60.mp4

После загрузки такие файлы не удаляются, если такой же фрагмент запрошен снова, сервер отправит уже существующий фрагмент.

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

Настройка каталога для размещения фрагментов

По умолчанию, фрагменты записываются в каталог

Code Block
themeRDark
/usr/local/FlashphonerWebCallServer/records

(туда же, куда по умолчанию помещены записи).

В сборке 5.2.957 добавлена возможность указать отдельный каталог для фрагментов при помощи настройки

Code Block
themeRDark
mp4_cutter_dir=/tmp

Ограничения

1. Загрузка и воспроизведение фрагментов поддерживается только для MP4 контейнера. При запросе webm файла запись всегда загружается полностью.

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

Контроль записи потока на бэкенд сервере

В сборке 5.2.1416 добавлена возможность получения событий, сигнализирующих о том, что началась или завершилась запись потока. Для этого WCS отправляет на бэкенд сервер запрос /StreamEvent  

Code Block
languagejs
themeRDark
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
languagejs
themeRDark
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
languagejs
themeRDark
{
 "uri": "multi-recorder://test-record"
}

...

404 - Not found

500 - Internal error

...

Параметры

...

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

...

Описание

...

Пример

...

mediaSessionId

...

Идентификатор медиасессии потока

...

866a9910-fbfe-11eb-aae4-6f99b0c80a3a

...

Выбор контейнера для записи

Данная возможность доступна, начиная со сборки  5.2.1440. По умолчанию, запись производится в контейнер MP4

Code Block
themeRDark
multi_recorder_type=MP4

При необходимости (например, при публикации VP8+Opus потоков в конференции), можно выбрать контейнер MKV

Code Block
themeRDark
multi_recorder_type=MKV

Имя записываемого файла

Имя файла для записи нескольких потоков формируется по шаблону. При этом:

1. Параметр {streamName} подставляется согласно URI рекордера, с заменой символов, не допустимых к использованию в именах файлов, на подчеркивания.

2. Параметры {startTime},  {endTime} не могут быть определены, поскольку зависят от меток времени в потоке, а потоков в данном случае несколько. Поэтому рекомендуется для присвоения метки времени файлу использовать параметры {startTimeMillis}, {endTimeMillis}, которые проставляются согласно часам сервера.

Например, с шаблоном

Code Block
languagejs
themeRDark
stream_record_policy_template={streamName}-{startTime}-{startTimeMillis}-{endTime}-{endTimeMillis}

...

Code Block
languagejs
themeRDark

...

{
 "uri": "multi-recorder://test-record",
 "mediaSessionId": "866a9910-fbfe-11eb-aae4-6f99b0c80a3a"
}

...

404 - Not found

500 - Internal error

...

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


Code Block
languagejs
themeRDark
{
 "uri": "multi-recorder://test-record"

...

будет следующим:

...


}

409 - Conflict

500 - Internal error


Запустить рекордер для записи нескольких потоков

/multipleRecorder/add
Code Block
languagejs
themeRDark
{
 "uri": "multi-recorder

...

://test-record",
 "mediaSessionId": "866a9910-fbfe-

...

11eb-

...

Здесь {startTime},  {endTime} заменены на -1.

Директория для файлов записей нескольких потоков

По умолчанию файлы записей нескольких потоков сохраняются в каталог WCS_HOME/records. Начиная со сборки 5.2.1088, каталог для сохранения записей можно изменить при помощи параметра

Code Block
themeRDark
multi_record_dir=/usr/local/FlashphonerWebCallServer/records

Необходимо, чтобы указанный каталог был доступен для записи, Например, при настройке

Code Block
themeRDark
multi_record_dir=/opt/media

права должны быть заданы следующим образом

Code Block
languagebash
themeRDark
sudo chmod o+w /opt/media

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

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

Code Block
languagebash
themeRDark
cd /usr/local/FlashphonerWebCallServer/tools
./offline_mixer_tool.sh multi-recorder___test-record--1-1628821032180--1-1628821151750.mp4

Настройки микширования задаются в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json. По умолчанию настройки следующие:

Code Block
languagejs
themeRDark
{
  "hasVideo": "true",
  "hasAudio": "true",
  "mixerDisplayStreamName": true
}

Микшированный файл помещается в тот же каталог, где лежит оригинальный файл, к его имени добавляется суффикс _mixed, например

...

themeRDark
aae4-6f99b0c80a3a"
}

404 - Not found

409 - Conflict

500 - Internal error

Добавить в рекордер поток из указанной медиасессии
/multipleRecorder/find_all
Code Block
languagejs
themeRDark
[
  {
    "mediaSessionsId": [
      "866a9910-fbfe-11eb-aae4-6f99b0c80a3a",
      "9f1e2530-fbfe-11eb-9ec1-77172ac14d86",
      "a970d0a0-fbfe-11eb-8fcc-912807bab442"
    ],
    "uri": "multi-recorder://test-record",
    "fileName": "multi-recorder___test-record

...

Пример кадра из микшированного файла

Image Removed

Warning

Микширование работает только для контейнера MP4

Получение информации о дорожках из записанного файла

...

.mp4"
  }
]

404 - Not found

500 - Internal error

Найти все рекордеры
/multipleRecorder/remove
Code Block
language

...

js
themeRDark

...

./offline_mixer_tool.sh --show-tracks-info ../records/multi-recorder___test-record.mp4
{
 "uri": "multi-recorder://test-record",
 "mediaSessionId": "866a9910-fbfe-11eb-aae4-6f99b0c80a3a"
}

404 - Not found

500 - Internal error

Удалить поток из рекордера
/multipleRecorder/terminate
Code Block
languagejs
themeRDark

...

{
 "uri": "

...

multi-recorder://test-record"
}

404 - Not found

500 - Internal error

Остановить рекордер

Параметры

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

Описание

Пример

uriURI рекордераmulti-recorder://test-record

mediaSessionId

Идентификатор медиасессии потока

866a9910-fbfe-11eb-aae4-6f99b0c80a3a

filenameИмя файла, куда производится записьmulti-recorder___test-record.mp4

Выбор контейнера для записи

Данная возможность доступна, начиная со сборки  5.2.1440. По умолчанию, запись производится в контейнер MP4

Code Block
themeRDark
multi_recorder_type=MP4

При необходимости (например, при публикации VP8+Opus потоков в конференции), можно выбрать контейнер MKV

Code Block
themeRDark
multi_recorder_type=MKV

Имя записываемого файла

Имя файла для записи нескольких потоков формируется по шаблону. При этом:

1. Параметр {streamName} подставляется согласно URI рекордера, с заменой символов, не допустимых к использованию в именах файлов, на подчеркивания.

2. Параметры {startTime},  {endTime} не могут быть определены, поскольку зависят от меток времени в потоке, а потоков в данном случае несколько. Поэтому рекомендуется для присвоения метки времени файлу использовать параметры {startTimeMillis}, {endTimeMillis}, которые проставляются согласно часам сервера.

Например, с шаблоном

Code Block
languagejs
themeRDark
stream_record_policy_template={streamName}-{startTime}-{startTimeMillis}-{endTime}-{endTimeMillis}

имя файла для рекордера с URI

Code Block
languagejs
themeRDark
"uri": "multi-recorder://test-record"

будет следующим:

Code Block
themeRDark
multi-recorder___test-record--1-1628821032180--1-1628821151750.mp4

Здесь {startTime},  {endTime} заменены на -1.

Директория для файлов записей нескольких потоков

По умолчанию файлы записей нескольких потоков сохраняются в каталог WCS_HOME/records. Начиная со сборки 5.2.1088, каталог для сохранения записей можно изменить при помощи параметра

Code Block
themeRDark
multi_record_dir=/usr/local/FlashphonerWebCallServer/records

Необходимо, чтобы указанный каталог был доступен для записи, Например, при настройке

Code Block
themeRDark
multi_record_dir=/opt/media

права должны быть заданы следующим образом

Code Block
languagebash
themeRDark
sudo chmod o+w /opt/media

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

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

Code Block
languagebash
themeRDark
cd /usr/local/FlashphonerWebCallServer/tools
./offline_mixer_tool.sh multi-recorder___test-record--1-1628821032180--1-1628821151750.mp4

Настройки микширования задаются в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json. По умолчанию настройки следующие:

Code Block
languagejs
themeRDark
{
  "hasVideo": "true",
  "hasAudio": "true",
  "mixerDisplayStreamName": true
}

Микшированный файл помещается в тот же каталог, где лежит оригинальный файл, к его имени добавляется суффикс _mixed, например

Code Block
themeRDark
multi-recorder___test-record--1-1628821032180--1-1628821151750_mixed.mp4

Пример кадра из микшированного файла

Image Added

Начиная со сборки 5.2.1481, микшируются потоки как из MP4, так и из MKV контейнеров. Результат всегда записывается в MP4 контейнер.

Получение информации о дорожках из записанного файла

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

Code Block
languagebash
themeRDark
./offline_mixer_tool.sh --show-tracks-info ../records/multi-recorder___test-record.mp4

В этом случае инструмент выведет данные в формате JSON. Например, для файла с записью конференции с двумя участниками:

Code Block
languagejs
themeRDark
titleTwo participants track information example
collapsetrue
[
  {
    "durationInMS": "37282",
    "trackEdits": [
      {
        "endInMs": "14",
        "type": "pause",
        "startInMs": "0"
      },
      {
        "endInMs": "37282",
        "type": "media",
        "startInMs": "14"
      }
    ],
    "channels": "2",
    "trackType": "AUDIO",
    "trackId": "1",
    "timescale": "44100",
    "typestreamName": "pauseroom-09f012-user1-e6ff",
    "trackCodec": "mp4a",
    "startInMssampleRate": "044100",
    "mediaSessionId": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d"
  },
  {
    "durationInMS": "37336",
    "trackEdits": [
      {
        "endInMs": "3728237336",
        "type": "media",
        "startInMs": "140"
      }
    ],
    "channelstrackType": "2VIDEO",
    "trackTypetrackId": "AUDIO0",
    "trackIdwidth": "1320",
    "timescale": "4410090000",
    "streamName": "room-09f012-user1-e6ff",
    "trackCodec": "mp4aavc1",
    "sampleRatemediaSessionId": "44100e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d",
    "mediaSessionIdheight": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d240"
  },
  {
    "durationInMS": "39274",
    "trackEdits": [
      {
        "endInMs": "100",
        "type": "37336",
"pause",
        "startInMs": "0"
     "trackEdits": [ },
      {
        "endInMs": "3733621534",
        "type": "mediapause",
        "startInMs": "0100"
      },
      ],
{
        "trackTypeendInMs": "VIDEO39274",
        "trackIdtype": "0media",
        "widthstartInMs": "32021534",
     "timescale": "90000", }
    "streamName": "room-09f012-user1-e6ff"],
    "trackCodecchannels": "avc12",
    "mediaSessionIdtrackType": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9dAUDIO",
    "heighttrackId": "2403"
  },
  {
    "durationInMStimescale": "3927444100",
    "trackEdits": ["streamName": "room-09f012-user2-f746",
      {"trackCodec": "mp4a",
        "endInMssampleRate": "10044100",
        "typemediaSessionId": "pause",f74633a1-1c2a-11ec-bba5-af8cf43275a8"
  },
  {
    "startInMsdurationInMS": "039303",
      },"trackEdits": [
      {
        "endInMs": "2153421434",
        "type": "pause",
        "startInMs": "1000"
      },
      {
        "endInMs": "3927439303",
        "type": "media",
        "startInMs": "2153421434"
      }
    ],
    "channelstrackType": "2VIDEO",
    "trackTypetrackId": "AUDIO2",
    "trackIdwidth": "3320",
    "timescale": "4410090000",
    "streamName": "room-09f012-user2-f746",
    "trackCodec": "mp4a",
    "sampleRate": "44100avc1",
    "mediaSessionId": "f74633a1-1c2a-11ec-bba5-af8cf43275a8"
  },
  {
    "durationInMS": "39303bba5-af8cf43275a8",
    "trackEditsheight": ["240"
      {
        "endInMs": "21434",
        "type": "pause",
        "startInMs": "0"
      },
      {
        "endInMs": "39303",
        "type": "media",
        "startInMs": "21434"
      }
    ],
    "trackType": "VIDEO",
    "trackId": "2",
    "width": "320",
    "timescale": "90000",
    "streamName": "room-09f012-user2-f746",
    "trackCodec": "avc1",
    "mediaSessionId": "f74633a1-1c2a-11ec-bba5-af8cf43275a8}
]

Здесь:

  • durationInMS - длительность дорожки в миллисекундах

  • trackType - тип дорожки: AUDIO или VIDEO

  • trackId - идентификатор дорожки
  • streamName - имя потока, к которому принадлежит эта дорожка
  • mediaSessionId - идентификатор медиассессии потока
  • timescale - количество семплов дорожки в секунду
  • trackCodec - кодек дорожки
  • width, height - размеры картинки для видеодорожки, по первому ключевому кадру
  • channels - количество каналов для аудиодорожки
  • sampleRate - частота дискретизации для аудиодорожки, совпадает с timescale
  • trackEdits - описание временной шкалы дорожки

Временная шкала дорожки описывается как набор отрезков, построенный в соответствии с атомом MP4 'edit lists`, со следующими параметрами:

  • startInMs - время начала отрезка в миллисекундах относительно начала файла
  • endInMs - время окончания отрезка в миллисекундах относительно начала файла
  • type - тип отрезка: медиаданные (media) или пауза (pause)

По этим данным из файла можно извлечь нужную дорожку при помощи ffmpeg или другого инструмента редактирования MP4 файлов.

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

Code Block
languagejs
themeRDark
titleRe-added stream track information example example
collapsetrue
[
  {
    "durationInMS": "78978",
    "heighttrackEdits": "240"[
    }
]

Здесь:

  • durationInMS - длительность дорожки в миллисекундах

  • trackType - тип дорожки: AUDIO или VIDEO

  • trackId - идентификатор дорожки
  • streamName - имя потока, к которому принадлежит эта дорожка
  • mediaSessionId - идентификатор медиассессии потока
  • timescale - количество семплов дорожки в секунду
  • trackCodec - кодек дорожки
  • width, height - размеры картинки для видеодорожки, по первому ключевому кадру
  • channels - количество каналов для аудиодорожки
  • sampleRate - частота дискретизации для аудиодорожки, совпадает с timescale
  • trackEdits - описание временной шкалы дорожки

Временная шкала дорожки описывается как набор отрезков, построенный в соответствии с атомом MP4 'edit lists`, со следующими параметрами:

  • startInMs - время начала отрезка в миллисекундах относительно начала файла
  • endInMs - время окончания отрезка в миллисекундах относительно начала файла
  • type - тип отрезка: медиаданные (media) или пауза (pause)

По этим данным из файла можно извлечь нужную дорожку при помощи ffmpeg или другого инструмента редактирования MP4 файлов.

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

Code Block
languagejs
themeRDark
titleRe-added stream track information example example
collapsetrue
[
  {
    "durationInMS": "78978  {
        "endInMs": "63050",
        "type": "pause",
        "startInMs": "0"
      },
      {
        "endInMs": "78978",
        "type": "media",
        "startInMs": "63050"
      }
    ],
    "channels": "2",
    "trackEditstrackType": ["AUDIO",
    "trackId":  {"3",
    "timescale": "44100",
    "streamName": "test",
    "endInMstrackCodec": "63050mp4a",
    "sampleRate": "44100",
    "typemediaSessionId": "pause",fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c"
  },
  {
    "startInMsdurationInMS": "039708",
      },"trackEdits": [
      {
        "endInMs": "7897823150",
        "type": "media",
        "startInMs": "630500"
      }
    ],
    "channels": "2",
    "trackType": "AUDIO",
    "trackId": "31",
    "timescale": "44100",
    "streamName": "test",
    "trackCodec": "mp4a",
    "sampleRate": "44100",
    "mediaSessionId": "fbbf5b50c7bc1460-20ee-11ec-bf06-ef6ec6048b2c"
  },
  {
    "durationInMS": "3970839791",
    "trackEdits": [
      {
        "endInMs": "2315023233",
        "type": "media",
        "startInMs": "0"
      }
    ],
    "channelstrackType": "2VIDEO",
    "trackTypetrackId": "AUDIO0",
    "trackIdwidth": "1640",
    "timescale": "4410090000",
    "streamName": "test",
    "trackCodec": "avc1",
    "mediaSessionId": "c7bc1460-20ee-11ec-bf06-ef6ec6048b2c",
    "height": "mp4a","360"
  },
  {
    "durationInMS": "63050",
    "trackEdits": [
    "sampleRate  {
        "endInMs": "44100",
39791",
        "mediaSessionIdtype": "c7bc1460-20ee-11ec-bf06-ef6ec6048b2c"pause",
  },
  {
    "durationInMSstartInMs": "397910",
    "trackEdits": [  },
      {
        "endInMs": "2323350191",
        "type": "media",
        "startInMs": "039791"
      }
    ],
    "trackType": "VIDEO",
    "trackId": "0": "2",
    "width": "640",
    "timescale": "90000",
    "streamName": "test",
    "trackCodec": "avc1",
    "mediaSessionId": "ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c",
    "widthheight": "640360",
  }
]

Извлечение отдельных потоков из MKV контейнера

В сборке 5.2.1440 с помощью инструмента для микширования записанных потоков можно извлечь отдельные потоки из MKV контейнера:

Code Block
languagebash
themeRDark
./offline_mixer_tool.sh  "timescale": "90000",
    "streamName": "test",
    "trackCodec": "avc1",
    "mediaSessionId": "--pull-streams ../records/multi-recorder___test-record.mkv

При этом будут созданы MKV файлы для каждого из потоков:

Code Block
languagebash
themeRDark
multi-recorder___test-record_fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c.mkv
multi-recorder___test-record_c7bc1460-20ee-11ec-bf06-ef6ec6048b2c",
    "height": "360"
  },
  {
    "durationInMS": "63050",
    "trackEdits": [
      {
        "endInMs": "39791",
        "type": "pause",
        "startInMs": "0"
      },
      {
        "endInMs": "50191",
        "type": "media",
        "startInMs": "39791"
      }
    ],
    "trackType": "VIDEO",
    "trackId": "2",
    "width": "640",
    "timescale": "90000",
    "streamName": "test",
    "trackCodec": "avc1",
    "mediaSessionId": "ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c",
    "height": "360"
  }
]

Извлечение отдельных потоков из MKV контейнера

В сборке 5.2.1440 с помощью инструмента для микширования записанных потоков можно извлечь отдельные потоки из MKV контейнера:

Code Block
languagebash
themeRDark
./offline_mixer_tool.sh --pull-streams ../records/multi-recorder___test-record.mkv

...

.mkv
multi-recorder___test-record_ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c.mkv

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

Code Block
themeRDark
multi_recorder_mkv_fill_gaps=false

Скрипт для обработки записанных файлов

По окончании записи нескольких потоков в один файл, запускается cкрипт обработки, заданный настройкой

Code Block
themeRDark
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
languagebash
themeRDark
LOGGER_ENABLED=true

Многопоточное кодирование при микшировании записанных потоков

В сборке 5.2.1089 добавлена возможность включить многопоточное кодирование при микшировании записанных потоков. Для этого в файл /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json  необходимо добавить параметр

Code Block
languagejs
themeRDark
{
  ...,
  "multithreading": true
}

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

Количество процессорных потоков при многопоточном кодировании

В сборке 5.2.1523 добавлена настройка количества процессорных потоков, используемых для многопоточного кодирования. По умолчанию, количество процессорных потоков равно половине доступных системе ядер CPU. Например, на сервере с 12 CPU по умолчанию буду использовать 6 потоков

Code Block
languagejs
themeRDark
{
  ...,
  "threadCount": 6
}

Если микширование записе занимает долгое время, значение можно увеличить, но не рекомедуется указывать больше, чем количество ядер CPU на сервере, которое можно определить при помощи команды

Code Block
languagebash
themeRDark
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
themeRDark
multi_recorder_mkv_fill_gaps=false

Скрипт для обработки записанных файлов

По окончании записи нескольких потоков в один файл, запускается cкрипт обработки, заданный настройкой

Code Block
themeRDark
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
languagebash
themeRDark
LOGGER_ENABLED=true

...

lscpu | grep -E "^CPU\(s\)"

Отображение имени записанного потока

По умолчанию, в микшированной записи нескольких потоков отображается имя каждого потока. При необходимости, это можно отключить настройкой в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json 

Code Block
languagejs
themeRDark
{
  ...,
  "mixerDisplayStreamName": false
}

При записи потоков в конференции с использованием RoomApi, имя потока включает имя комнаты конференции и идентификатор потока участника, например  room-1882a6-bob-037c. В сборке 5.2.1642 добавлена возможность исключить имя комнаты при помощи настроек

Code Block
languagejs
themeRDark
{
  ...,
  "mixerDisplayStreamName": true,
  "mixerTextDisplayRoom": false,
  "labelReplaceRegex": "\\w+-\\w+-([^\\-]+)-\\w+",
  "labelReplaceWith":""
}

Здесь:

  • labelReplaceRegex - регулярное выражение для замены элементов в имени потока
  • labelReplaceWith - строка, которая должна заменить элементы, найденные по регулярному выражению, пустая строка исключает найденные элементы

В этом случае для указанного выше примера будет отображаться только имя участника bob.

Декодирование символов в имени записанного потока

В сборке 5.2.10891751 добавлена возможность включить многопоточное кодирование при микшировании записанных потоков. Для этого в файл /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json  необходимо добавить параметрдекодирования символов в имени потока, закодированных на стороне клиента при помощи encodeURIComponent()

Code Block
languagejs
themeRDark
{
  ...,
  "multithreadingmixerDecodeStreamName": true
}

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

Отправка данных о завершении записи нескольких потоков

...