Skip to content

Instantly share code, notes, and snippets.

@alexanderankin
Created March 17, 2016 01:37
Show Gist options
  • Save alexanderankin/1284214e4de86707e13d to your computer and use it in GitHub Desktop.
Save alexanderankin/1284214e4de86707e13d to your computer and use it in GitHub Desktop.

usage

  • npm i
  • node untitled.js

and on the client

  • curl localhost:8000 | vlc -
{
"name": "learnmp3",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"lame": "^1.2.3",
"readable-stream": "^2.0.6"
}
}
var lame = require('lame');
var http = require('http');
// var Readable = require('stream').Readable;
var clients = {};
function writeBits(readable) {
for (var i = 0; i < 100; i++) {
readable.push(new Buffer())
}
}
var makeclientstore = function () {
var store = {};
var counter = 0;
function storeClient(rr) {
console.log("counter is ", counter);
store[counter++] = rr;
return counter;
}
function delClient(counter) {
console.log("deleting counter");
delete store[counter-1];
return counter;
}
function getStore() {
return store;
}
return ({
storeClient: storeClient,
delClient: delClient,
getStore: getStore
});
}
var getEncoder = function () {
return 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: 128,
outSampleRate: 22050,
mode: lame.STEREO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});
}
var clientstore = makeclientstore();
// Listen on a web port and respond with a chunked response header.
var server = http.createServer(function(req, res){
res.writeHead(200,{
"Content-Type": "audio/mpeg",
'Transfer-Encoding': 'chunked'
});
var counter = clientstore.storeClient({r: req, s: res });
var rs = new (require('stream')).Readable;
rs._read = function () {
var i = 0;
rs.push("hello");
if (i++>100)
rs.push(null);
}
var e = getEncoder()
rs.pipe(e);
e.pipe(res);
console.log('Client connected; streaming');
res.on("close", function () {
console.log("from: ", Object.keys(clientstore.getStore()));
clientstore.delClient(counter);
console.log("to: ", Object.keys(clientstore.getStore()));
});
});
server.listen("8000", "127.0.0.1");
console.log('Server running at http://127.0.0.1:8000');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment