Узел (сокет) живой аудиопоток / трансляция
Пожалуйста, есть ли какой-нибудь простой способ для потоковой передачи (трансляции) медиафайлов (ogg, mp3, spx..) с сервера на клиент (браузер) через NODE.js и, возможно, SOCKET.IO?
Я должен записать аудиовход на стороне сервера, а затем иметь возможность воспроизводить его в реальном времени для многих клиентов. Я возился с потоками binary.js или socket.io, но не смог сделать это правильно.
Я пытался закодировать аудиовход с помощью speex, vorbis или lame, а затем загрузить его с помощью FS клиенту, но у меня ничего не получилось. Или я должен захватить PCM, а затем декодировать его в браузере?
Любое предложение по этому вопросу, ничто, что я нашел, никогда не помогало мне
Большое спасибо за любые советы, ссылки и идеи.
3 ответа
Вы захотите поискать пакеты, которые работают на потоках, и оттуда это просто о том, что вы можете направлять свои потоки для вывода по мере необходимости. Используя Express или просто встроенный HTTP, вы можете сделать это довольно легко. Вот пример, построенный вокруг osx-audio, который обеспечивает поток PCM, lame, который может кодировать поток в mp3, и Express:
var Webcast = function(options) {
var lame = require('lame');
var audio = require('osx-audio');
var fs = require('fs');
// create the Encoder instance
var encoder = new lame.Encoder({
// input
channels: 2, // 2 channels (left and right)
bitDepth: 16, // 16-bit samples
sampleRate: 44100, // 44,100 Hz sample rate
// output
bitRate: options.bitrate,
outSampleRate: options.samplerate,
mode: (options.mono ? lame.MONO : lame.STEREO) // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});
var input = new audio.Input();
input.pipe(encoder);
// set up an express app
var express = require('express')
var app = express()
app.get('/stream.mp3', function (req, res) {
res.set({
'Content-Type': 'audio/mpeg3',
'Transfer-Encoding': 'chunked'
});
encoder.pipe(res);
});
var server = app.listen(options.port);
}
module.exports = Webcast;
То, как вы получаете поток ввода, может быть самой интересной частью, но это будет зависеть от вашей реализации. Популярный request
Пакет также построен на потоках, так что это может быть просто HTTP-запрос!
В веб-браузере у вас есть элемент видео HTML5 и элемент аудио. У них обоих есть источники. Каждый веб-браузер изначально поддерживает разные кодеки. Так что вы должны следить за этим, если вы пытаетесь транслировать mp3.
Вам не нужен socket.io, вам нужен только HTTP. Ваше приложение читает файл, music.ogg
и для каждого блока, который он читает, он отправляет его через http-сервер. Это будет один единственный HTTP-запрос, который остается открытым до тех пор, пока файл не будет передан.
Вот как будет выглядеть ваш HTML:
<audio src="http://example.com/music.ogg"></audio>
И ваш код nodejs будет примерно таким (еще не проверял):
var http = require('http');
var fs = require('fs');
http.on('request', function(request, response) {
var inputStream = fs.open('/path/to/music_file.ogg');
inputStream.pipe(response);
})
Я использую только метод ReadableStream.pipe на inputStream
и модули http и fs для приведенного выше кода. Если вы хотите перекодировать аудиофайл (например, из mp3 в ogg), вам нужно найти модуль, который делает это, и направить данные из файла в транскодер, а затем в response
:
// using some magical transcoder
inputStream.pipe(transcoder).pipe(response);
Метод вызовет end
в потоке, когда он заканчивает запись, так что HTTP-запрос будет завершен, как только файл будет прочитан (и перекодирован).
Вы можете сделать это с помощью узла и RTC. Есть некоторые инструменты, готовые к использованию, такие как SimpleWebRTC или EasyRTC. Для того, что я уже тестировал видео, все еще проблема, но аудио работает отлично.