Задать вопрос
@gracer

В чём проблема передачи звука с микрофона по websocket в связке JS-PHP?

Приветствую.
Пытаюсь пощупать возможности передачи потоковых данных в режиме онлайн через вебсокеты. Для начала решил поэксперементировать только со звуком, т.е. реализовать подобие голосового чата. Т.к. наиболее близко знаком с PHP, на пощупать реализую сервер на этом языке с помощью Workerman. Суть проблемы: есть простейший код клиента на JS, который берёт поток с микрофона, режет его рекордером и отправляет серверу. Код подсматривал со статьи на хабре, там сервер написан на Go.
var socket = new WebSocket('ws://10.0.0.5:27801/');
    navigator.mediaDevices.getUserMedia({
        audio: true
    })
    .then(function(stream) {
      var $audio = document.getElementById("audio");
      var mediarecorder = new MediaRecorder(stream, {mimeType: "audio/webm; codecs=\"opus\""});
      // send
      mediarecorder.ondataavailable = function(e) {
        if (e.data && e.data.size > 0) {
          socket.send(e.data);
        }
      }
      mediarecorder.start(1000);
});


И есть простейший сервер на PHP, который просто отправляет полученные данные обратно.
<?php
include_once(__DIR__."/Workerman/Autoloader.php");

use Workerman\Lib\Timer;
use Workerman\Worker;

$worker = new Worker("websocket://0.0.0.0:27801");

$worker->onConnect = function($c){
    echo "Connected\n";
};

$worker->onMessage = function($c, $data){
    $c->send($data);
};

Worker::runAll();

Так вот если таким подходом отправлять текст, то всё ок. Но в описаной выше ситуации коннект на js просто отваливается при передаче данных с ошибкой в строке коннекта
WebSocket connection to 'ws://10.0.0.5:27801/' failed: Could not decode a text frame as UTF-8.

Нагуглить решение не удалось, менять тип коннекта на сервере пробовал. По логике оба конца работают с Blob.
Просьба поделиться советами и опытом.
  • Вопрос задан
  • 920 просмотров
Подписаться 2 Сложный Комментировать
Решения вопроса 1
@gracer Автор вопроса
Вопрос решился изменением типа коннета перед отправкой в метод onMessage вместо onConnect
$c->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
use Workerman\Protocols\Websocket;

$worker->onConnect = function($c){
    echo "Connected\n";
    $c->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
    //или Websocket::BINARY_TYPE_BLOB 
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы