Я настроил сервер PHP WebSocket, который может читать строковые данные от клиентов. Мой вопрос о том, как обрабатывать двоичные типы данных. Ниже приведен код на стороне клиента, который записывает вход микрофона как объект Float32Array и отправляет данные через соединение WebSocket в двоичном виде.
websocket = new WebSocket("ws://...");
websocket.binaryType = "arraybuffer";
recorder.onaudioprocess = function(stream) {
var inputData = stream.inputBuffer.getChannelData(0);
websocket.send(inputData);
}
Что касается серверной части, я использую следующие функции, которые я нашел в Интернете для кодирования / снятия маскировки.
function mask($text)
{
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($text);
if( $length <= 125)
$header = pack('CC', $b1, $length);
elseif ($length > 125 && $length < 65536)
$header = pack('CCS', $b1, 126, $length);
elseif ($length >= 65536)
$header = pack('CCN', $b1, 127, $length);
return $header.$text;
}
function unmask($payload)
{
$length = ord($payload[1]) & 127;
if($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
$len = (ord($payload[2]) << 8) + ord($payload[3]);
}
elseif($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
$len = (ord($payload[2]) << 56) + (ord($payload[3]) << 48) +
(ord($payload[4]) << 40) + (ord($payload[5]) << 32) +
(ord($payload[6]) << 24) +(ord($payload[7]) << 16) +
(ord($payload[8]) << 8) + ord($payload[9]);
}
else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
$len = $length;
}
$text = '';
for ($i = 0; $i < $len; ++$i) {
$text .= $data[$i] ^ $masks[$i%4];
}
return $text;
}
Код прекрасно работает, за исключением того, что он работает только со строковыми данными, а не для двоичного типа. У меня вопрос, как мне обрабатывать двоичные типы и отправлять их клиентам?
Я действительно не понимаю, что вы пытаетесь сделать. WebRTC может использоваться для создания соединений Peer2Peer. Таким образом, вы будете использовать ваш сервер PHP в качестве сервера сигнализации. Фактические данные не передаются на ваш сервер, если только они не нужны для переадресации, поскольку не удалось установить p2p-соединение. Это то, что вы хотите сделать?
В противном случае создайте RtcPeerConnection и отправьте данные от однорангового узла, как это предусмотрено webrtc.
Других решений пока нет …