Потоковое аудио в реальном времени с помощью 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-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'));