Versions Compared

Key

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

...

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

Запись нескольких потоков в один файл с последующим микшированием

...

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

В сборке 5.2.1012 добавлена возможность записи нескольких потоков в один файл. В дальнейшем потоки могут быть извлечены из этого файла и смикшированы специальным инструментом. Несколько потоков могут быть записаны только в MP4 контейнер (H264 + AAC). Эта возможность предназначена, например, для записи видеоконференций. В отличие от MCU микшера, здесь микширование работает только при обработке уже записанного файла, и позволяет расходовать меньше ресурсов процессора непосредственно во время проведения конференции.

Запись нескольких потоков управляется по 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

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" : "

...

409 - Conflict

500 - Internal error

...

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

...

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

...

404 - Not found

409 - Conflict

500 - Internal error

...

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

...

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

...

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

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

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 контейнер (H264 + AAC). Эта возможность предназначена, например, для записи видеоконференций. В отличие от MCU микшера, здесь микширование работает только при обработке уже записанного файла, и позволяет расходовать меньше ресурсов процессора непосредственно во время проведения конференции.

Запись нескольких потоков управляется по 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

...

Здесь {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

...

",
 "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
Code Block
languagejs
themeRDark
{

...

 "

...

uri": "

...

multi-recorder://test-record",
 

...

"

...

mediaSessionId": "

...

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

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

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

Image Removed

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

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

...

languagebash
themeRDark

...

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

...

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

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

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

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

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

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",
    "streamName": "room-09f012-user1-e6ff",
    "trackCodec": "mp4a",
    "sampleRate": "44100",
    "mediaSessionId": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d"
  },
  {
    "durationInMS": "37336",
    "trackEdits": [
      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

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

Из файла с несколькими потоками внутри по умолчанию может быть воспроизведен только первый поток. Чтобы смотреть все потоки в файле, их необходимо смикшировать. Для этого предназначен инструмент 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, например

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

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

Image Added

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

В сборке 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": "3733614",
        "type": "mediapause",
        "startInMs": "0"
      },
    ],  {
        "trackTypeendInMs": "VIDEO37282",
        "trackIdtype": "0media",
    "width    "startInMs": "14"
      }
    ],
    "channels": "2",
    "trackType": "AUDIO",
    "trackId": "3201",
    "timescale": "9000044100",
    "streamName": "room-09f012-user1-e6ff",
    "trackCodec": "avc1mp4a",
    "mediaSessionIdsampleRate": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d44100",
    "heightmediaSessionId": "240e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d"
  },
  {
    "durationInMS": "3927437336",
    "trackEdits": [
      {
        "endInMs": "10037336",
        "type": "pausemedia",
        "startInMs": "0"
      },
      {],
      "trackType": "VIDEO",
    "endInMstrackId": "215340",
    "width": "320",
    "typetimescale": "pause90000",
        "startInMsstreamName": "100"room-09f012-user1-e6ff",
      }"trackCodec": "avc1",
      {"mediaSessionId": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d",
        "endInMsheight": "39274240",
  },
  {
    "typedurationInMS": "media39274",
        "startInMstrackEdits": "21534"[
      }{
    ],
    "channelsendInMs": "2100",
        "trackTypetype": "AUDIOpause",
        "trackIdstartInMs": "30",
    "timescale": "44100"  },
     "streamName": "room-09f012-user2-f746",
 {
        "trackCodecendInMs": "mp4a21534",
    "sampleRate": "44100",
    "mediaSessionIdtype": "f74633a1-1c2a-11ec-bba5-af8cf43275a8"pause",
  },
  {
    "durationInMSstartInMs": "39303100",
     "trackEdits": [ },
      {
        "endInMs": "2143439274",
        "type": "pausemedia",
        "startInMs": "021534"
      },
      {],
        "endInMschannels": "393032",
        "type""trackType": "mediaAUDIO",
        "startInMstrackId": "21434"
      }
    ]3",
    "trackTypetimescale": "VIDEO44100",
    "trackIdstreamName": "2room-09f012-user2-f746",
    "widthtrackCodec": "320mp4a",
    "timescalesampleRate": "9000044100",
    "streamNamemediaSessionId": "roomf74633a1-1c2a-09f01211ec-user2bba5-f746af8cf43275a8"
  },
  {
    "trackCodecdurationInMS": "avc139303",
    "mediaSessionIdtrackEdits": "f74633a1-1c2a-11ec-bba5-af8cf43275a8",
 [
      {
        "heightendInMs": "24021434",
  }
]

Здесь:

  • 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      "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",
    "trackEditsheight": [
      {
        "endInMs": "63050",
        "type": "pause",
        "startInMs": "0"
      },
      {
        "endInMs": "78978",
        "type": "media",
        "startInMs": "63050"
      }
    ],
    "channels": "2",
    "trackType": "AUDIO",
    "trackId": "3",
    "timescale": "44100",
    "streamName": "test",
    "trackCodec": "mp4a",
    "sampleRate": "44100",
    "mediaSessionId": "fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c"
  },
  {
    "durationInMS": "39708",
 "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",
    "trackEdits": [
      {
        "endInMs": "2315063050",
        "type": "mediapause",
        "startInMs": "0"
      },
      ],{
        "channelsendInMs": "278978",
        "trackTypetype": "AUDIOmedia",
        "startInMs": "63050"
      }
    ],
    "channels": "2",
    "trackType": "AUDIO",
    "trackId": "13",
    "timescale": "44100",
    "streamName": "test",
    "trackCodec": "mp4a",
    "sampleRate": "44100",
    "mediaSessionId": "c7bc1460fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c"
  },
  {
    "durationInMS": "3979139708",
    "trackEdits": [
      {
        "endInMs": "2323323150",
        "type": "media",
        "startInMs": "0"
      }
    ],
    "trackTypechannels": "VIDEO2",
    "trackIdtrackType": "0AUDIO",
    "widthtrackId": "6401",
    "timescale": "9000044100",
    "streamName": "test",
    "trackCodec": "avc1mp4a",
    "mediaSessionIdsampleRate": "c7bc1460-20ee-11ec-bf06-ef6ec6048b2c44100",
    "heightmediaSessionId": "360c7bc1460-20ee-11ec-bf06-ef6ec6048b2c"
  },
  {
    "durationInMS": "6305039791",
    "trackEdits": [
      {
        "endInMs": "3979123233",
        "type": "pausemedia",
        "startInMs": "0"
      },
      {
        "endInMs": "50191",
        "type": "media",
        "startInMs": "39791"
      }
    ],
    "trackType": "VIDEO",
    "trackId": "20",
    "width": "640",
    "timescale": "90000",
    "streamName": "test",
    "trackCodec": "avc1",
    "mediaSessionId": "ed3ebda0c7bc1460-20ee-11ec-bf06-ef6ec6048b2c",
    "height": "360"
  }
]

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

По окончании записи нескольких потоков в один файл, запускается 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.1123 добавлена возможность отправки POST запроса на указанный URL при завершении записи нескольких потоков в файл и микширования этой записи. Таким образом, можно получить информацию о том, в какой файл смикшированы записанные потоки из чат-комнаты.

URL  для отправки запроса задается в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json :

Code Block
languagejs
themeRDark
{
  ...,
  "callbackUrl": "http://backend.url/multiRecorderCallback"
}

...

,
  {
    "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"
  }
]

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

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

Code Block
themeRDark
on_multiple_record_hook_script=on_multiple_record_hook.sh

...

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

Начиная со сборки 5.2.1123 поверх предыдущей, или в том случае, если используется собственный 1023, скрипт on_multiple_record_hook.sh  , необходимо модифицировать его следующим образом:по умолчанию записывает в лог /usr/local/FlashphonerWebCallServer/logs/multi-record.log  только результат обработки, чтобы снизить нагрузку на диск во время работы инструмента микширования. При необходимости, можно включить подробное логирование для отладки, установив переменную в скрипте

Code Block
languagebash
themeRDark
titleon_multiple_record_hook.sh
collapsetrue
# This script copies a recorded stream to client/records
FILE_NAME=$1
CREATION_MODIFICATION_TIME=$2
DURATION_IN_MS=$3
RECORDER_URI=$4
WCS_HOME=/LOGGER_ENABLED=true

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

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

...

/conf/offline_mixer

...

POST  запрос содержит данные в формате JSON:.json  необходимо добавить параметр

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

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

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

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

URL  для отправки запроса задается в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json :

Code Block
languagejs
themeRDark
{
  ...,
  "callbackUrl": "http://backend.url/multiRecorderCallback"
}

Данные для отправки передаются через скрипт /usr/local/FlashphonerWebCallServer/bin/on_multiple_record_hook.sh  при вызове offline_mixer_tool.sh . Поэтому при установке сборки 5.2.1123 поверх предыдущей, или в том случае, если используется собственный скрипт on_multiple_record_hook.sh , необходимо модифицировать его следующим образом:

Code Block
languagebash
themeRDark
titleon_multiple_record_hook.sh
collapsetrue
# This script copies a recorded stream to client/records
FILE_NAME=$1
CREATION_MODIFICATION_TIME=$2
DURATION_IN_MS=$3
RECORDER_URI=$4
WCS_HOME=/usr/local/FlashphonerWebCallServer
LOG_FILE=$WCS_HOME/logs/multi-record.log
MIXER_TOOL=$WCS_HOME/tools/offline_mixer_tool.sh
# Set LOGGER_ENABLED to true to enable mixing debug logging
LOGGER_ENABLED=false

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Start mixing multiple recording file $FILE_NAME" >> $LOG_FILE

if $LOGGER_ENABLED; then
    bash $MIXER_TOOL $FILE_NAME $CREATION_MODIFICATION_TIME $DURATION_IN_MS $RECORDER_URI >> $LOG_FILE 2>&1
else
    bash $MIXER_TOOL $FILE_NAME $CREATION_MODIFICATION_TIME $DURATION_IN_MS $RECORDER_URI > /dev/null 2>&1
fi

CODE=$?
if [ "$CODE" -ne "0" ]; then
    if [ "$CODE" -eq "64" ]; then
        echo "ERROR: File to mix not found" >> $LOG_FILE
    elif [ "$CODE" -eq "65" ]; then
        echo "ERROR: Offline mixer config not found" >> $LOG_FILE
    else
	    echo "ERROR: Offline mixer tool error code: $CODE" >> $LOG_FILE
	fi
	exit $CODE
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Multiple recording file $FILE_NAME is mixed successfully" >> $LOG_FILE
exit 0

POST  запрос содержит данные в формате JSON:

Code Block
languagejs
themeRDark
POST /multiRecorderCallback HTTP/1.1
Content-Type: application/json
Content-Length: 463
Host: localhost
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.5 (java 1.5)
Accept-Encoding: gzip,deflate

{
  "multiRecorderCreationModificationTime":3724973476,
  "multiRecorderDurationInMS":44061,
  "multiRecorderFilePath":"/usr/local/FlashphonerWebCallServer/multirecords/stream-32c7edd7-37bf-4bf2-a58d-955679c5287e-mockLogin.mp4",
  "recorderUri":"multi-recorder://room-bace1f",
  "mixerParams":
  [
    {
      "path":"/usr/local/FlashphonerWebCallServer/multirecords/stream-32c7edd7-37bf-4bf2-a58d-955679c5287e-mockLogin_mixed.mp4",
      "durationInMs":44000,
      "creationModificationTime":3724973524
    }
  ]
}

В запросе передаются параметры исходного файла записи нескольких потоков:

  • multiRecorderCreationModificationTime - время создания файла записи
  • multiRecorderDurationInMS - длительность файла записи в миллисекундах
  • multiRecorderFilePath - путь к файлу записи
  • recorderUri - идентификатор рекордера, при использовании RoomApi содержит имя комнаты

Параметры микшированного файла:

  • path - путь к микшированному файлу
  • durationInMs - длительность микшированного файла в миллисекундах
  • creationModificationTime - время создания микшированного файла

Контроль свободного места при микшировании записи нескольких потоков

В сборке 5.2.1317 добавлен контроль свободного места при микшировании записи нескольких потоков. Если места на диске остается меньше заданного, микширование не начнется или остановится. Значение задается настройкой в файле /usr/local/FlashphonerWebCallServer/conf/offline_mixer.json 

Code Block
languagejs
themeRDark
{
  ...,
  "minAvailableSpace": "1G"
}

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

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

В сборке 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" : "addedToMultiRecording",
  "payload" : {
    "fileName" : "stream-0389ff08-7e45-4f00-a579-9d253319cba4-mockLogin.mp4",
    "uri" : "multi-recorder://test-record"
  }
}

при добавлении потока и

Code Block
languagejs
themeRDark
POST /multiRecorderCallback HTTP/1.1
Content-Type: application/json
Content-Length: 463
Host: localhost
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.5 (java 1.5)
Accept-Encoding: gzip,deflate
URL:http://localhost:8081/apps/EchoApp/StreamEvent
OBJECT:
{
  "multiRecorderCreationModificationTimenodeId" :3724973476,
  "multiRecorderDurationInMS":44061"d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.1.39",
  "multiRecorderFilePathappKey" :"/usr/local/FlashphonerWebCallServer/multirecords/stream-32c7edd7-37bf-4bf2-a58d-955679c5287e-mockLogin.mp4 "defaultApp",
  "recorderUrisessionId" :"multi-recorder://room-bace1f",
  "mixerParams":
  [
    {
      "path":"/usr/local/FlashphonerWebCallServer/multirecords/stream-32c7edd7-37bf-4bf2-a58d-955679c5287e-mockLogin_mixed.mp4 "/192.168.1.83:49977/192.168.1.39:8443-591009c4-e051-4722-b34d-71cf2ade3bed",
  "mediaSessionId" : "15de2290-4089-11ed-88fe-d78a87cf3386",
  "type"   : "durationInMsremovedFromMultiRecording":44000,
      "creationModificationTimepayload" :3724973524 {
    }
"fileName"  ]
}

В запросе передаются параметры исходного файла записи нескольких потоков:

  • multiRecorderCreationModificationTime - время создания файла записи
  • multiRecorderDurationInMS - длительность файла записи в миллисекундах
  • multiRecorderFilePath - путь к файлу записи
  • recorderUri - идентификатор рекордера, при использовании RoomApi содержит имя комнаты

Параметры микшированного файла:

  • path - путь к микшированному файлу
  • durationInMs - длительность микшированного файла в миллисекундах
  • creationModificationTime - время создания микшированного файла

Контроль свободного места при микшировании записи нескольких потоков

...

: "stream-0389ff08-7e45-4f00-a579-9d253319cba4-mockLogin.mp4",
    "uri" : "multi-recorder://test-record"
  }
}

при его удалении из рекордера.

При обновлении WCS  с предыдущих сборок в конфигурацию бэкенд приложения необходимо добавить метод StreamEvent 

Code Block
languagejs
themeRDark
{
  ...,
  "minAvailableSpace": "1G"
}

...

add app-rest-method defaultApp StreamEvent
add app-rest-method MyAppKey StreamEvent

Известные проблемы

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

...