Event "STREAM_STATUS.READY"

houbig

New Member
Добрый день, вопрос по event-ам для Web SDK. Есть ли возможность получить флаг об успешном создании стрима, но до начала записи? Я использую WCS для записи и хотелось бы предупредить пользователя о том, что запись начнется через скажем 3 секунды и по истечению времени запустить запись стрима.
 

Max

Administrator
Staff member
Добрый день.
Вы можете стартовать запись в любое время после старта публикации потока (STREAM_STATUS.PUBLISHING) по REST API, например:
1. Получить mediaSessionId потока по имени
Code:
POST /rest-api/stream/find HTTP/1.1
Host: wcs:8081
Content-Type: application/json
 
{
    "name":"stream1",
    "published":true
}
2. Отрисовать предупреждение пользователю
3. Начать запись
Code:
POST /rest-api/recorder/startup HTTP/1.1
Host: wcs:8081
Content-Type: application/json                      
                              
{
    "mediaSessionId": "5a072377-73c1-4caf-abd3"
}
 

houbig

New Member
Спасибо, попробую. Просто я не фиксировался на REST запросах. Можете подсказать где взять правильный пример с REST коммуникацией?
 

Max

Administrator
Staff member
Посмотрите здесь:
Описание REST API
/stream/find
/recorder/startup
/recorder/terminate
Пример bash скрипта для записи потока по имени
Bash:
mediaId=`curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/stream/find --data "{\"name\":\"$1\",\"published\":true}" | jq '.[] | .mediaSessionId'`
postDataJson="{\"mediaSessionId\":$mediaId}"
curl -s -H "Content-Type: application/json" -X POST http://localhost:8081/rest-api/recorder/startup -d ${postDataJson} | jq
 

houbig

New Member
Добрый день, еще пару вопросов по REST.
1. при помощи стандартного создания стрима, во время публикации, есть возможность переключения камеры без прерывания самой записи ( stream.switchCam() ), насколько я понимаю в REST имплементации данная возможность теряется?
2. если я настроил формат названия записываемого файла и директории сохранения (stream_record_policy_template, record_dir), есть ли необходимость в bash скрипте который Вы предлагаете?
 

Max

Administrator
Staff member
1. при помощи стандартного создания стрима, во время публикации, есть возможность переключения камеры без прерывания самой записи ( stream.switchCam() ), насколько я понимаю в REST имплементации данная возможность теряется?
Если Вы публикуете поток с клиента, он не может быть создан по REST API. На клиенте Вы должны использовать WebSDK в браузере.
Переключение камеры также реализовано на стороне браузера, в WebSDK.
REST API может использоваться для захвата RTSP, RTMP потоков со стороннего сервера, для ретрансляции опубликованного потока на сторонний RTMP сервер, для наблюдения за потоками на сервере, для старта и остановки записи.
В Вашем случае, если мы верно понимаем то, как Вы его описали, Вам нужно записать опубликованный из браузера поток не сразу при старте публикации, а с определенной выдержкой времени. Для этого и служит REST API метод /recorder/startup, а /stream/find нужен, чтобы найти опубликованный поток на сервере.
2. если я настроил формат названия записываемого файла и директории сохранения (stream_record_policy_template, record_dir), есть ли необходимость в bash скрипте который Вы предлагаете?
Скрипт приведен как пример использования REST API запросов, которые Вам понадобятся: первый запрос находит поток по имени и получает mediaSessionId, второй начинает запись этого потока.
 

houbig

New Member
Если честно, запутался...

У меня есть фронт-энд с WebSDK установленном на том же физическом сервере что и WCS. Клиент запускает запись аналагично примеру "Stream Recording" с некоторыми дополнительными возможностями по управлению медиа-девайсов. Я хочу контролировать момент начала записи, так как без этого начало видео будет жутким, пока пользователь поймет что запись началась.

Поэтому я изначально спросил есть ли возможность получения промежуточного статуса "ready" до начала "publishing", чтобы дать оповещен ие пользователю с обратным отсчетом времени и по истечению времени инициировать начало записи.
 

houbig

New Member
Code:
Flashphoner.createSession({urlServer: urlServer}).on(SESSION_STATUS.ESTABLISHED, function (session) {
        publishStream(session);
    }).on(SESSION_STATUS.DISCONNECTED, function () {
        setStatus(SESSION_STATUS.DISCONNECTED);
        onStopped();
    }).on(SESSION_STATUS.FAILED, function () {
        setStatus(SESSION_STATUS.FAILED);
        onStopped();
    });

function publishStream(session) {

    session.createStream({
        name: streamName,
        display: recordVideo,
        constraints: constraints,
        mediaConnectionConstraints: mediaConnectionConstraints,
        /*sdpHook: rewriteSdp,*/
        transport: transportInput,
        cvoExtension: cvo,
        stripCodecs: strippedCodecs,
        record: true,
        receiveVideo: false,
        receiveAudio: false

    }).on(STREAM_STATUS.PUBLISHING, function (stream) {
        setStatus(stream.status());
        onStarted(stream);
    }).on(STREAM_STATUS.UNPUBLISHED, function (stream) {
        setStatus(stream.status());
        showDownloadLink(stream.getRecordInfo());
        onStopped();
    }).on(STREAM_STATUS.FAILED, function (stream) {
        setStatus(stream.status(), stream.getInfo());
        addStatusLog(stream);
        showDownloadLink(stream.getRecordInfo());
        onStopped();
    }).publish();
}
 

houbig

New Member
правильно ли я понимаю, что мне необходимо полюбому вызвать publishStream() и после этого работать с REST API метод /recorder/startup, а /stream/find ?
 

Max

Administrator
Staff member
правильно ли я понимаю, что мне необходимо полюбому вызвать publishStream() и после этого работать с REST API метод /recorder/startup, а /stream/find ?
Последовательность должна быть такая:
1. Поток публикуется на клиенте
Code:
session.createStream({
    name: streamName,
    display: localVideo,
    ...
}).publish()
При этом [ICODE]record: true[/ICODE] проставлять не нужно.
2. После получения STREAM_STATUS.PUBLISHING отправляется запрос /stream/find, чтобы получить mediaSessionId этого потока.
3. После получения mediaSessionId, дается оповещение пользователю с отсчетом времени.
4. По истечении указанного времени, отправляется запрос /recorder/startup, чтобы начать запись потока.
 

houbig

New Member
Спасибо большое, заработало. Еще пару советов, если можно, по правильной настройке системы.
  • Я хочу жестко выставить "same domain origin" - rest_access_control_allow_origin=http://siteurl - будет достаточно?
  • у меня есть система авторизации со своим токеном, для REST - "rest_hook_send_hash=true;rest_hook_secret_key=1234567890" настройки на бекэнде достаточно или-же необходима синхронизация и на фронте тоже?
  • Есть ли параметр настройки "flashphoner.properties" по максимальному времени записываемого файла?
 

Max

Administrator
Staff member
Я хочу жестко выставить "same domain origin" - rest_access_control_allow_origin=http://siteurl - будет достаточно?
Этого достаточно для закрытия междоменных запросов для REST API
у меня есть система авторизации со своим токеном, для REST - "rest_hook_send_hash=true;rest_hook_secret_key=1234567890" настройки на бекэнде достаточно или-же необходима синхронизация и на фронте тоже?
Эти настройки предназначены для REST хуков, но не для REST API, и относятся к отправке REST запросов /connect, /publishStream, /playStream и т.д. на бэкенд-сервер, для того, чтобы разрешить или запретить клиенту установку соединения или публикацию потока. Если Вы этим функционалом не пользуетесь, то эти настройки Вам не нужны.
Если Вы хотите авторизовать REST API запросы, это можно сделать только на WCS.
Есть ли параметр настройки "flashphoner.properties" по максимальному времени записываемого файла?
Нет. Если Вам необходимо остановить запись через определенное время, используйте REST API запрос /recorder/terminate.
Есть настройка ротации файлов записей по времени или по размеру, но запись при этом продолжается, просто сохраняется очередной кусок.
 
Top