नोड: संभव इवेंटइमीटर स्मृति रिसाव त्रुटियों के कारण अद्वितीय ऑडियो धाराओं की सेवा

निम्न उदाहरण में जो मैं करने की कोशिश कर रहा हूं वह प्रत्येक क्लाइंट के लिए एक अद्वितीय स्ट्रीम प्रारंभ करता है जो सर्वर से कनेक्ट होता है और क्लाइंट को HTML5 के ऑडियो टैग के माध्यम से उस स्ट्रीम को सेवा देता है। क्योंकि मुझे एक लाइव अनुभव चाहिए क्योंकि मैं अपने ट्रांसकोडिंग से नवीनतम स्ट्रीम को ऑडियो स्ट्रीम के आउटपुट में लिखने का प्रयास कर रहा हूं। परीक्षण उद्देश्यों के लिए मैं एनपीआर सार्वजनिक धारा को पकड़ रहा हूं, इसे ट्रांसकोड.एस के माध्यम से speex में ट्रांसकोड कर रहा हूं, और इसे अपने ग्राहकों को सेवा दे रहा हूं।

मुद्दा यह है कि जब मैं कनेक्ट करता हूं, ट्रांसकोडेड स्ट्रीम ऑडियो टैग के माध्यम से नहीं खेलती है। यदि मैं स्थानीयहोस्ट का उपयोग कर vlc के माध्यम से स्ट्रीम खोलने का प्रयास करता हूं: 3002/स्ट्रीम, नोड निम्न त्रुटि संदेशों को कई बार आउटपुट करता है और स्ट्रीम भी नहीं चलाता है।

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at ServerResponse.EventEmitter.addListener (events.js:160:15)
    at Stream.pipe (stream.js:121:8)
    at CustomEmitter. (~/nodejs/audio_stream/sample.js:62:5)
    at CustomEmitter.EventEmitter.emit (events.js:95:17)
    at CustomEmitter.stream (~/nodejs/audio_stream/sample.js:23:7)
    at Socket. (~/nodejs/audio_stream/sample.js:32:11)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket. (_stream_readable.js:720:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:392:10)

मुझे लगता है कि मेरा मुद्दा यह है कि मैं कैसे/स्ट्रीम कर रहा हूं, लेकिन मुझे सच में यकीन नहीं है। मैं वास्तव में क्या गलत कर रहा हूँ?

नमूना कोड यहां दिया गया है:

transcode.sh:

#!/bin/bash
ffmpeg -i "$1" -f ogg -acodec libspeex -ar 8000 -af 'volume=5.0' 2>/dev/null pipe:1

sample.js:

// contents of transcode.sh script:
// #!/bin/bash
// ffmpeg -i "$1" -f ogg -acodec libspeex -ar 8000 -af 'volume=5.0' 2>/dev/null pipe:1

var express = require('/usr/local/lib/node_modules/express');
var http = require('http');
var spawn = require('child_process').spawn;
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var fs = require('fs');
var stream = require('stream');

var app = express();
var webServer = http.createServer(app);
var audServer = http.createServer(app);

function CustomEmitter() {
    EventEmitter.call(this);
}
util.inherits(CustomEmitter, EventEmitter);

CustomEmitter.prototype.stream = function(data) {
    this.emit('stream', data);
};

var emitter = new CustomEmitter();

function getStream(arg1,arg2) {
    var cmd = spawn(arg1,arg2);
    //cmd.stdout.setEncoding('utf8');
    cmd.stdout.on('data', function(data) {
        emitter.stream(data);
    });
}

app.get('/', function(req, res){
    res.send(
    "<script src='/socket.io/socket.io.js'></script>\n"+
    "<script>var socket=io.connect('http://127.0.0.1:3000');</script>\n"+
    "<script>\n"+
    "\tsocket.on('id', function(data) {\n"+
    "\t\taudio = document.getElementById('webStream');\n"+
    "\t\taudio.setAttribute(\"src\",'http://127.0.0.1:3002/stream);\n"+
    "\t});\n"+
    "</script>\n"+
    ""
    );
});
webServer.listen(3000);

app.get('/stream', function(req, res){
    getStream('./transcode.sh',['http://nprdmp.ic.llnwd.net/stream/nprdmp_live01_mp3']);

    res.header('Content-Type', "audio/ogg");
    res.header('Transfer-Encoding', 'chunked');

    var s = new stream.Stream();
    s.readable = true;

    emitter.on('stream', function(data) {
        s.emit('data', data);
        s.pipe(res);
    });
});
audServer.listen(3002);
0

1 उत्तर

कोड की संरचना मेरे लिए गलत लगती है। मुख्य मुद्दा यह है कि emitter का उपयोग कैसे किया जाता है। /stream हैंडलर में कोड लगातार stream ईवेंट पर श्रोता जोड़ता है और इसे कभी भी हटा नहीं देता है। तो यह एक प्रकार की जावास्क्रिप्ट मेमोरी रिसाव है। मुझे लगता है कि एक बेहतर तरीका विधि द्वारा प्राप्त ईवेंट एमिटर को वापस कर सकता है और ईवेंट हैंडलर संलग्न कर सकता है।

0
जोड़ा