Unpublish event duplication

NewUser

New Member
Добрый вечер!
Столкнулись с проблемой задваивания события при анпаблише стрима, бэкэнд хукает дважды StreamStatusEvent. Подскажите были ли жалобы на такое поведение?
 

Max

Administrator
Staff member
Добрый день.
Вопроизведите проблему и соберите отчет, как описано здесь. В логах сервера должны быть все отправки событий на бэкенд, например:
Code:
16:31:14,725 INFO            RestClient - API-ASYNC-pool-13-thread-1 SEND REST OBJECT ==>
URL:http://localhost:8081/apps/RoomApp/StreamStatusEvent
OBJECT:
{
  "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@95.191.130.39",
  "appKey" : "roomApp",
  "sessionId" : "/5.129.23.83:56526/95.191.130.39:8443-c9eacb99-2d0c-4543-8f25-6ba0c22e1f4f",
  "mediaSessionId" : "0c08bea1-00d0-11ec-843d-898c18782773",
  "name" : "room-1190f1-test1-0c08",
  "published" : true,
  "hasVideo" : true,
  "hasAudio" : true,
  "status" : "UNPUBLISHED",
  ...
  "info" : "Stopped by publisher stop",
  ...
}
Отчет пришлите, используя эту форму.
 
Last edited:

Max

Administrator
Staff member
Судя по логам, вы используете сборку WCS 5.2.394. На последней сборке 5.2.1022 нам не удается воспроизвести проблему по следующему сценарию:
1. Публикация потока в примере MediaDevices
2. Старт записи потока по REST API /stream/startRecording (или установкой опции record: true при публикации потока)
3. Старт републикации на RTMP сервер по REST API /push/startup
4. Снятие снапшота потока по REST API /stream/snapshot
5. Остановка публикации потока нажатием кнопки Stop в примере с отправкой unPublishStream
6. Закрытие websocket соединения нажатием кнопки Disconnect
При этом StreamStatusEvent со статусом UNPUBLISHED отправляется для publish-сессии один раз.
Между Вашей сборкой и текущей было множество различных изменений, поэтому, скорее всего, проблема, которая воспроизводится у Вас, уже исправлена. Рекомендуем обновить сервер до последней сборки и проверить.
Также обращаем Ваше внимание, что указание имени в настройке ip_local (как видно по логу) не рекомендуется, поскольку эта настройка задает локальный интерфейс сервера для привязки портов.
Кроме того, не рекомендуется запускать WCS с пустыми полями ip и ip_local, как в файле flashphoner.properties в архиве. Автоматическое определение адресов при старте в Вашей сборке работает только в инстансе AWS. В последних сборках автоматическое определение адресов при старте работает, только если скрипт запуска обнаруживает эндпойнты AWS или Google Cloud.
Также видно, что присланный файл конфигурации не соответствует логам, поскольку в логе есть опции, которых нет в файле flashphoner.properties в архиве. В дальнейшем, крайне рекомендуется не вносить никаких изменений в предоставляемые данные, и собирать отчеты при помощи скрипта report.sh. В противном случае мы не сможем Вам помочь корректно диагностировать проблему.
 
Last edited:

NewUser

New Member
Логи собирали по инструкции выше. Спасибо попробуем обновиться.
 

Max

Administrator
Staff member
Логи собирали по инструкции выше.
В таком случае, возможно, изменения в файл настроек были внесены до сбора логов, но без перезапуска сервера. С целью более точной диагностики, такое не допускается.
 

NewUser

New Member
Добрый день! Обновление не помогло, так же прилетает два события unpublish(в StreamStatusEvent), при том что с фронта уходит одно событие.
 
Last edited:

Max

Administrator
Staff member
Предоставьте, пожалуйста, SSH доступы к серверу, включая доступы к веб-интерфейсу для публикации, при помощи этой формы.
Также поясните, верен ли сценарий, по которому мы тестируем, или чего-то в нем не хватает.
 

NewUser

New Member
Предоставить доступ не представляется возможным. Причину сузил, так случается если сделать unPublishStream и сразу сделать дисконект.
 

Max

Administrator
Staff member
Предоставить доступ не представляется возможным.
В таком случае мы можем только пытаться воспроизводить проблему.
Причину сузил, так случается если сделать unPublishStream и сразу сделать дисконект.
Тогда проблема должна воспроизводиться в примере WebRTC as RTMP republishing с небольшой модификацией:
1. Добавляем закрытие сессии в функцию onStopped, которая вызывается в обработчике STREAM_STATUS.UNPUBLISHED
Code:
function onStopped() {
    $("#publishBtn").text("Start").off('click').click(publishBtnClick).prop('disabled', false);
    ...
    if (Flashphoner.getSessions().length > 0) {
        Flashphoner.getSessions()[0].disconnect();
    }
}
2. Добавляем запись потока при публикации (чтобы достичь максимального сходства с Вашим сценарием)
Code:
function startStreaming(session) {
    var streamName = field("streamName");
    var rtmpUrl = field("rtmpUrl");
    session.createStream({
        name: streamName,
        display: localVideo,
        cacheLocalResources: true,
        receiveVideo: false,
        receiveAudio: false,
        rtmpUrl: rtmpUrl,
        record: true
    }).on(STREAM_STATUS.PUBLISHING, function(publishStream){
        ...
    }).publish();
}
Однако, проблема не воспроизводится, REST hook /StreamStatusEvent cо следующими полями:
Code:
  ...
  "status" : "UNPUBLISHED",
  ...
  "info" : "Stopped by publisher stop",
  ...
высылается на бэкенд один раз.
Прилагаем модифицированный пример. Проверьте, воспроизводится ли у Вас проблема в этом примере. Если не воспроизводится, модифицируйте его код так, чтобы проблема воспроизводилась, и пришлите, используя эту форму
Также обращаем Ваше внимание, что, если Вы явным образом закрываете websocket-сессию после остановки публикации, это рекомендуется делать только после получения статуса STREAM_STATUS.UNPUBLISHED или STREAM_STATUS.FAILED, как сделано во всех примерах, поставляемых вместе с WebSDK и WCS, поскольку и старт, и остановка публикации проходят асинхронно и включают обмен сообщениями между клиентом и сервером.
 

Attachments

NewUser

New Member
Соединение закрывает Ваш пакет(node_modules/@codevadmin/flashphoner-api/src/flashphoner-core.js:1974).
Подскажите еще момент:
Почему на StreamStatusEvent custom поля приходят, а на unPublishStream нет. Так же "record" : true приходит StreamStatusEvent на unPublishStream же он false
 

Max

Administrator
Staff member
Соединение закрывает Ваш пакет(node_modules/@codevadmin/flashphoner-api/src/flashphoner-core.js:1974).
Это не наш пакет, и он основан на устаревшей сборке WebSDK. Официальный NPM пакет доступен здесь: @flashphoner/websdk
Кроме того, WebSDK сам не закрывает соединение, если в клиентском коде явно не вызван Session.disconnect(), если страница не закрыта в браузере и сервер не закрыл соединение на своей стороне.
Пожалуйста, обновите WebSDK до актуальной сборки и попробуйте воспроизвести проблему по предложенному выше варианту. Если проблема не воспроизводится. то причина. скорее всего, в Вашем клиентском коде.
Почему на StreamStatusEvent custom поля приходят, а на unPublishStream нет.
На это есть тикет WCS-2738.
Так же "record" : true приходит StreamStatusEvent на unPublishStream же он false
На это завели тикет WCS-3320.
Однако, Вы можете пользоваться хуком /StreamStatusEvent, где приходит актуальный стейт стрима на момент остановки. В качестве ключа, однозначно идентифицирующего стрим, может быть использовано сочетание полей:
Code:
  "sessionId" : "/192.168.1.83:52618/192.168.1.39:8443-1c8c20c1-71b2-41c6-9e95-85bf346c14f7",
  "mediaSessionId" : "f1450bd0-0ac2-11ec-987f-3b4d13bd936a",
  "name" : "07673041",
которое идет во всех REST хуках, относящихся к данному стриму.
 

Max

Administrator
Staff member
Добрый день.
По тикету WCS-2738. В сборке 5.2.1036 добавлена возможность передачи custom объекта из /publishStream в /unpublishStream, а также для пары /playStream-/stopStream.
 

Max

Administrator
Staff member
Добрый день.
По тикету WCS-3320. В сборке 5.2.1038 актуальное состояние потока на момент остановки публикации (hasAudio, hasVideo, record) приходит в событии /unPublishStream.
 
Top