在PHP中编码/取消屏蔽Websocket二进制数据

时间:2015-04-17 04:59:09

标签: php websocket webrtc web-audio

我已经设置了一个能够从客户端读取字符串数据的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;
}

代码很有效,除了它们只处理字符串数据而不处理二进制类型。我的问题是如何处理二进制类型并将其推送给客户端?

1 个答案:

答案 0 :(得分:0)

我没有真正得到你想做的事。 WebRTC可用于创建Peer2Peer连接。因此,您将使用PHP Server作为信令服务器。除非需要转发,否则实际数据不会传递到您的服务器,因为无法建立p2p连接。那是你想做的吗? 否则,创建一个RtcPeerConnection并按照webrtc的意图从对等方发送数据。