Потоковое аудио в реальном времени с помощью Socket.io

Я создал небольшой проект для потоковой передачи живого аудио с помощью Socket.io. Проблема в том, что это работает только тогда, когда я тестирую его в том же окне Chrome. Когда другой компьютер пытается слушать или транслировать, он не может. Это сообщение, которое появляется на другом компьютере:

GET blob:https://server/ce74cfe7-bb9c-40b0-9cb0-1138b22b1b11 404 (Not Found)

Это код в main.js (веб-сайт):

$(document).ready(function(){
    var socket = io("https://server:4000", verify=false);
    socket.on('audio stream', function(name, blob){
        var video = document.querySelector('video');
        video.src = blob;
    });
    $('#ptt').click(function(){
        micOn();
        document.getElementById("ptt").disabled = true;
        document.getElementById("ptt-off").disabled = false;
    });
    $('#ptt-off').click(function(){
        stream.getAudioTracks()[0].stop();
        document.getElementById("ptt").disabled = false;
        document.getElementById("ptt-off").disabled = true;
    });
    function micOn(){
        navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

        var constraints = {
            audio: true,
            video: false
        };
        var video = document.querySelector('video');

        function successCallback(stream) {
            window.stream = stream; // stream available to console
            var blob = window.URL.createObjectURL(stream);
            socket.emit('audio stream', myName, blob);
        }

        function errorCallback(error) {
            console.log('navigator.getUserMedia error: ', error);
        }

        navigator.getUserMedia(constraints, successCallback, errorCallback);
    }
});

И это код на сервере (index.js):

socket.on('audio stream', function(name, blob){
    console.log(name + ' is broadcasting audio');
    socket.broadcast.emit('audio stream', name, blob);
});

1 ответ

Для потоковой передачи через Socket.io вам необходимо использовать библиотеку socket.io-stream.

socket.io-поток

Быстрый пример с сайта socket.io-stream с использованием файла ниже.

For streaming between server and client, you will send stream instances first. To receive streams, you just wrap socket with socket.io-stream, then listen any events as usual.

Server:

var io = require('socket.io').listen(80);
var ss = require('socket.io-stream');
var path = require('path');

io.of('/user').on('connection', function(socket) {
  ss(socket).on('profile-image', function(stream, data) {
    var filename = path.basename(data.name);
    stream.pipe(fs.createWriteStream(filename));
  });
});
createStream() returns a new stream which can be sent by emit().

Client:

var io = require('socket.io-client');
var ss = require('socket.io-stream');

var socket = io.connect('http://example.com/user');
var stream = ss.createStream();
var filename = 'profile.jpg';

ss(socket).emit('profile-image', stream, {name: filename});
fs.createReadStream(filename).pipe(stream);
You can stream data from a client to server, and vice versa.

// send data 
ss(socket).on('file', function(stream) {
  fs.createReadStream('/path/to/file').pipe(stream);
});

// receive data 
ss(socket).emit('file', stream);
stream.pipe(fs.createWriteStream('file.txt'));
Другие вопросы по тегам