Versions Compared

Key

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

Table of Contents

Описание

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

Поддерживаемые протоколы:

  • WebRTC
  • RTMP
  • RTSP

Форматы записи:

  • MP4 для кодеков H.264 + AAC
  • WebM для кодека VP8 + Vorbis

Краткое руководство по тестированию

Запись трансляции

1. Для теста используем демо-сервер demo.flashphoner.com и веб-приложение Stream Recording

https://demo.flashphoner.com/client2/examples/demo/streaming/stream_recording/recording.html


2. Нажмите кнопку "Start". Начнется захват и трансляция потока.


3. Нажмите кнопку "Stop". Трансляция остановится, отобразится ссылка на воспроизведение и скачивание записанного фрагмента


Настройка

Серверная часть

Включение и отключение записи потоков

По умолчанию запись потоков включена на стороне WCS-сервера.
Для отключения в конфиг /usr/local/FlashphonerWebCallServer/conf/flashphoner.properties следует добавить

Code Block
languagebash
themeRDark
record_streams=false

Настройка

Code Block
languagebash
themeRDark
record_flash_published_streams=true

включает запись потоков, опубликованных при помощи Flash, RTMP-кодировщика или с другого RTMP-сервера.

Настройка

Code Block
languagebash
themeRDark
record_rtsp_streams=true

включает запись потоков, захваченных с RTSP IP-камер.

Формирование имени файла записи потока

По умолчанию, имя файла формируется по шаблону, который задается настройкой stream_record_policy_template.

Code Block
languagebash
themeRDark
stream_record_policy_template=stream-{mediaSessionId}-{login}

Доступны следующие элементы шаблона:

ЭлементОписаниеМаксимальный размер
{streamName}Имя потока
{startTime}Время начала записи потока20 символов
{endTime}Время окончания записи потока20 символов
{sessionId}Идентификатор сессии в кодировке BASE6460 символов
{mediaSessionId}Идентификатор медиасессии36 символов
{login}Логин32 символа
{audioCodec}Аудиокодек4 символа
{videoCodec}Видеокодек4 символа

Например, настройка

Code Block
languagebash
themeRDark
stream_record_policy_template={streamName}

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

Code Block
languagebash
themeRDark
ffmpeg -re -i BigBuckBunny.mp4 -preset ultrafast -acodec aac -vcodec h264 -strict -2 -f flv rtmp://test1.flashphoner.com:1935/live/stream_ffmpeg

будет записан в файл stream_ffmpeg.mp4.

Расширение файла добавляется в зависимости от параметров потока и контейнера: mp4 для H264+AAC и webm для VP8+opus.

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

Code Block
languagebash
themeRDark
encode_record_name=true,HEX

При этом имя файла будет закодировано шестнадцатиричным числом. Настройка

Code Block
languagebash
themeRDark
encode_record_name=true,BASE64

кодирует имя файла при помощи BASE64.

Другой способ экранирования недопустимых символов - их удаление при помощи параметра exclude_record_name_characters. По умолчанию

Code Block
languagebash
themeRDark
exclude_record_name_characters=/

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

Code Block
languagebash
themeRDark
exclude_record_name_characters=:.,/

Ротация файлов записей

Потоки могут записываться частями заданной длительности или объема при помощи параметра record_rotation. Например, настройка

Code Block
languagebash
themeRDark
record_rotation=20

определяет длительность фрагмента в 20 секунд, а настройка

Code Block
languagebash
themeRDark
record_rotation=10M

задает объем фрагмента в 10 мегабайт.

Если шаблон имени файла содержит элемент {startTime}, в имя файла подставляется время начала записи фрагмента. Если шаблон содержит элемент {endTime}, в имя файла подставляется время окончания записи фрагмента. Например, при настройках

Code Block
themeRDark
record_rotation=20
stream_record_policy_template={streamName}-{startTime}-{endTime}

фрагменты записи потока test именуются следующим образом

Code Block
themeRDark
test-1553577643961-1553577663988_1.mp4
test-1553577663989-1553577683997_2.mp4
test-1553577683997-1553577701626_3.mp4
...

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

При необходимости, нумерация может быть отключена настройкой

Code Block
themeRDark
record_rotation_index_enabled=false

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

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

Настройка on_record_hook_script указывает на shell-скрипт, который вызывается по завершении записи потока.

По умолчанию скрипт располагается в каталоге /usr/local/FlashphonerWebCallServer/bin:

Code Block
languagebash
themeRDark
on_record_hook_script=/usr/local/FlashphonerWebCallServer/bin/on_record_hook.sh

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

Code Block
languagebash
themeRDark
on_record_hook_script=/opt/on_record.sh

Этот скрипт можно использовать для копирования или перемещения записи потока из директории WCS_HOME/records в другое место по завершении записи.

Пример:

Code Block
languagebash
themeRDark
STREAM_NAME=$1
SRC_FILE=$2
SRC_DIR="/usr/local/FlashphonerWebCallServer/records/"
REPLACE_STR="/var/www/html/stream_records/$STREAM_NAME-"
DST_FILE="${SRC_FILE/$SRC_DIR/$REPLACE_STR}"
cp $SRC_FILE $DST_FILE

Здесь

  • $1 - имя потока
  • $2 - абсолютное имя файла записи потока
  • по завершении записи потока файл записи копируется в директорию /var/www/html/stream_records/

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

Настройка частоты дискретизации аудио при записи

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

Code Block
languagebash
themeRDark
record_audio_codec_sample_rate=48000

В данном случае частота дискретизации будет установлена в 48 кГц.

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

При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра 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/stream/startRecording
  • HTTPS: https://streaming.flashphoner.com:8444/rest-api/stream/startRecording

Здесь:

  • streaming.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательный префикс
  • /stream/startRecording - используемый REST-вызов

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

REST-метод

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

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

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

Описание

/stream/startRecording


Code Block
languagejs
themeRDark
{
 "mediaSessionId": "5a072377-73c1-4caf-abd3"
  "config": {
    "fileTemplate": "{streamName}-{startTime}-{endTime}",
    "rotation": "20M"
  }
}

404 - Not found

500 - Internal error


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


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

404 - Not found

500 - Internal error

Завершить запись потока в указанной медиасессии

Параметры

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

Описание

Пример

mediaSessionId

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

5a072377-73c1-4caf-abd3

configНастройки записи, имеют приоритет над настройками сервера
fileTemplateШаблон имени файла записи{streamName}-{startTime}-{endTime}
rotationВключает/отключает ротацию файлов и способ нарезки (время или объем)
20M

Логика работы записи по требованию выглядит следующим образом:

  • При вызове REST API /stream/startRecording завершается текущая запись, если она идет в данный момент.
  • Стартует новая запись, при этом применяются переданные через REST настройки.
  • Если какая-либо из настроек не передана, применяется соответствующая настройка сервера.

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

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

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

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

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();
    })
    ...

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

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

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

3. Скрипт обработки записанных файлов требует повышения прав для копирования и других операций над файлами записей на виртуальных машинах Amazon

Симптомы: операции над записанными файлами не выполняются

Решение: использовать sudo для файловых операций и вызова внешних скриптов, если WCS установлен на виртуальной машине Amazon, например

Code Block
languagebash
themeRDark
sudo cp $SRC_FILE $DST_FILE