Стриминг через chat rooms

Max

Administrator
Staff member
Добрый день.
Мне нужно сделать стриминг с чатом на примерно 300 зрителей
Уточните, пожалуйста: публикуется один стрим с 300 подписчиков, с возможностью текстового чата? Или предполагается еще и видеочат?
с возможностью сохранения истории сообщений в чате, возможно ли это все сделать через room api, как представлено в этой статье?
Да, для текстового чата можно использовать RoomApi.
Однако для того, чтобы сохранять историю, потребуется обработка REST hook на бэкенде. А именно, обрабатывать нужно как минимум /connect, чтобы получить идентификатор клиентской сессии sessionId, и /OnDataEvent, чтобы получить само сообщение. отправленное клиентом, и поместить его в БД.
Но RoomApi использует специальное встроенное в WCS приложение бэкенда, и без него работать не будет. Поэтому Вам придется проксировать на бэкенде все запросы, например:
PHP:
$body = file_get_contents('php://input');
$incoming_data = json_decode($body, true);

switch($api_method) {
    case"connect":
        // Save sessionId
        saveSessionId($incoming_data['sessionId']);
        // POST /connect query to WCS default RoomApp
        $response_data = json_decode(postToRoomApp($api_method, $body), true);
    break;
    case"OnDataEvent":
        // Save message
        if($incoming_data['payload']['command'] == "sendMessage") {
             saveMessage($incoming_data['sessionId'], $incoming_data['payload']);
        }
        // POST /OnDataEvent query to WCS default RoomApp
        $response_data = json_decode(postToRoomApp($api_method, $body), true);
    break;
    default:
        // POST any query to WCS default RoomApp
        $response_data = json_decode(postToRoomApp($api_method, $body), true);
    break;
}
header('HTTP/1.1 200 OK', true, 200);
header('Content-Type: application/json');
echo json_encode($response_data);

// Passing query to WCS default RoomApp
function postToRoomApp($method, $data_string) {
    // Here should be your WSC RoomApp address
    $wcs_url="http://wcs:8081/apps/RoomApp/" . $method;

    $response="";
    if( $curl = curl_init() ) {
        curl_setopt($curl, CURLOPT_URL, $wcs_url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json',                                                                              
                               'Content-Length: ' . strlen($data_string)));     
        $response = curl_exec($curl);
        $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if($http_code != 200) {
            ubnormalResponse($http_code);
        }
        error_log($response);
        curl_close($curl);
    }
    return($response);
}

function ubnormalResponse($code) {
    if ($code == 403) {
    header('HTTP/1.1 403 Forbidden', true, $code);
    } else {
    header(':', true, $code);
    }
    die();
}
При отправке клиентом сообщения через RoomApi бэкенд получает в /OnDataEvent такие данные
Code:
{
  "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@192.168.1.39",
  "appKey" : "roomApp",
  "sessionId" : "/192.168.1.83:61936/192.168.1.39:8443-7a076e23-186e-4069-ac29-b6b379fe8d8d",
  "operationId" : "7b806490-ae0a-11eb-852b-b1ab0521c1ce",
  "payload" : {
    "command" : "sendMessage",
    "options" : {
      "roomConfig" : {
        "name" : "room-35b923"
      },
      "to" : "test2",
      "text" : "hello"
    }
  },
  "origin" : "https://wcs:8888"
}
Таким образом, в Вашем случае использование RoomApi добавляет синтаксического сахара на стороне клиента, но приводит к необходимости дополнительного усложнения на бэкенде.
Возможно, Вам стоит воспользоваться методом Web SDK Session.sendData() для отправки сообщения с клиента, и REST API запросом /data/send для посылки сообщения другим подключенным клиентам. Подробности читайте здесь.
Начиная со сборки WCS 5.2.942 и сборки WebSDK 2.0.168, для организации текстового чата, привязанного к опубликованному стриму, можно использовать метод Stream.sendData() для отправки сообщения всем подписчикам с публикующего клиента, и REST API запрос /stream/event/send для отправки сообщения всем подписчикам с любого другого клиента (не паблишера) и с сервера. Подробности читайте здесь.
 

Artem Shabanov

New Member
Уточните, пожалуйста: публикуется один стрим с 300 подписчиков, с возможностью текстового чата? Или предполагается еще и видеочат?
Публикуется один стрим с 300 подписчиков с возможностью текстового чата
 

Max

Administrator
Staff member
Публикуется один стрим с 300 подписчиков с возможностью текстового чата
В этом случае RoomApi выглядит излишним. Если чат привязан к потоку, связка из
- Stream.sendData() для отправки сообщения всем подписчикам с публикующего клиента
- REST API запроса /stream/event/send для отправки сообщения всем подписчикам с любого другого клиента (не паблишера) и с сервера
- обработки на бэкенде REST хуков /sendStreamEvent и /StreamEvent
подходит для решения Вашей задачи.
 
Top