Include Page | WCS5RU:Запись трансляции | WCS5RU:Запись трансляции
---|
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 | ||||
---|---|---|---|---|
| ||||
record_streams=false |
Настройка
Code Block | ||||
---|---|---|---|---|
| ||||
record_flash_published_streams=true |
включает запись потоков, опубликованных при помощи Flash, RTMP-кодировщика или с другого RTMP-сервера.
Настройка
Code Block | ||||
---|---|---|---|---|
| ||||
record_rtsp_streams=true |
включает запись потоков, захваченных с RTSP IP-камер.
Формирование имени файла записи потока
Настройка stream_record_policy определяет способ формирования имени файла записи потока. Например,
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy=streamName |
означает, что имя файла будет соответствовать имени потока. Поток, опубликованный при помощи ffmpeg
Code Block | ||||
---|---|---|---|---|
| ||||
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.
По умолчанию, имя файла формируется по шаблону
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy=template |
В свою очередь, шаблон задается настройкой stream_record_policy_template. По умолчанию
Code Block | ||||
---|---|---|---|---|
| ||||
stream_record_policy_template=stream-{mediaSessionId}-{login} |
Доступны следующие элементы шаблона:
Элемент | Описание | Максимальный размер |
---|---|---|
{streamName} | Имя потока | |
{startTime} | Время начала записи потока (а не его создания) | 20 символов |
{sessionId} | Идентификатор сессии в кодировке BASE64 | 60 символов |
{mediaSessionId} | Идентификатор медиасессии | 36 символов |
{login} | Логин | 32 символа |
{audioCodec} | Аудиокодек | 4 символа |
{videoCodec} | Видеокодек | 4 символа |
Если имя файла создается из имени потока, в нем могут быть символы, недопустимые к использованию в именах, например, прямой слэш '/'. В этом случае имя файла должно быть закодировано при помощи настройки
Code Block | ||||
---|---|---|---|---|
| ||||
encode_record_name=true,HEX |
При этом имя файла будет закодировано шестнадцатиричным числом. Настройка
Code Block | ||||
---|---|---|---|---|
| ||||
encode_record_name=true,BASE64 |
кодирует имя файла при помощи BASE64.
Другой способ экранирования недопустимых символов - их удаление при помощи параметра exclude_record_name_characters. По умолчанию
Code Block | ||||
---|---|---|---|---|
| ||||
exclude_record_name_characters=/ |
Например, для исключения двоеточия, запятой, точки и слэша необходимо указать
Code Block | ||||
---|---|---|---|---|
| ||||
exclude_record_name_characters=:.,/ |
Ротация файлов записей
Потоки могут записываться частями заданной длительности при помощи параметра record_rotation. Например, настройка
Code Block | ||||
---|---|---|---|---|
| ||||
record_rotation=20 |
определяет длительность фрагмента в 20 секунд.
Части нумеруются последовательно. Если включена ротация, то, при записи в файл с фиксированным именем (например, при помощи REST-запроса), при остановке и возобновлении записи нумерация будет продолжена.
Скрипт обработки записанных файлов
Настройка on_record_hook_script указывает на shell-скрипт, который вызывается по завершении записи потока.
По умолчанию скрипт располагается в каталоге /usr/local/FlashphonerWebCallServer/bin:
Code Block | ||||
---|---|---|---|---|
| ||||
on_record_hook_script=/usr/local/FlashphonerWebCallServer/bin/on_record_hook.sh |
но может быть размещен в любом другом месте под другим именем, например:
Code Block | ||||
---|---|---|---|---|
| ||||
on_record_hook_script=/opt/on_record.sh |
Этот скрипт можно использовать для копирования или перемещения записи потока из директории WCS_HOME/records в другое место по завершении записи.
Пример:
Code Block | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
record_audio_codec_sample_rate=48000 |
В данном случае частота дискретизации будет установлена в 48 кГц.
Клиентская часть
При включении записи потоков на сервере, будет ли записан поток, или нет, зависит от значения параметра 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/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 |
| 404 - Not found 500 - Internal error | Начать запись потока в указанной медиасессии | ||||||||
/stream/stopRecording |
| 404 - Not found 500 - Internal error | Завершить запись потока в указанной медиасессии |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
mediaSessionId | Идентификатор сессии | 5a072377-73c1-4caf-abd3 |
fileName | Имя файла записи | recordStream.mp4 |
Если в REST запросе не указано явно имя файла, поток указанной медиасессии будет записан в файл с именем по шаблону, определенному в настройках.
Если имя указано, будет записан файл с таким именем. Если файл уже существует, запись будет пронумерована так же, как при ротации.
Известные проблемы
1. Максимальная длина имени файла во всех актуальных файловых системах Linux ограничена 255 символами. При создании файла записи, имя будет сокращено до данного предела, включая расширение и номер части, если включена ротация.
2. При записи потоков, опубликованных в конференции, ротация будет автоматически отключена, в противном случае полученные файлы будет невозможно объединить.
3. Скрипт обработки записанных файлов требует повышения прав для копирования и других операций над файлами записей на виртуальных машинах Amazon
Симптомы: операции над записанными файлами не выполняются
Решение: использовать sudo для файловых операций и вызова внешних скриптов, если WCS установлен на виртуальной машине Amazon, например
Code Block | ||||
---|---|---|---|---|
| ||||
sudo cp $SRC_FILE $DST_FILE |