2012-12-26 9 views
5

लिनक्स पर मोशन का उपयोग करके एक एमजेपीईजी स्ट्रीम पाइप करें, हर वेबकैम को अपने बंदरगाह पर स्ट्रीम के रूप में कार्य किया जाता है। अब मैं उन धाराओं को सेवा देना चाहता हूं, सभी एक ही बंदरगाह पर, Node.js. का उपयोग कर।एक Node.js प्रॉक्सी

  • संपादित करें: यह समाधान अब काम करता है। मैं (अपने मोशन config में जो था, "BoundaryString") मूल mjpeg धारा से सीमा स्ट्रिंग प्राप्त करने के लिए आवश्यक
 

app.get('/motion', function(req, res) { 

    var boundary = "BoundaryString"; 

    var options = { 
    // host to forward to 
    host: '192.168.1.2', 
    // port to forward to 
    port: 8302, 
    // path to forward to 
    path: '/', 
    // request method 
    method: 'GET', 
    // headers to send 
    headers: req.headers 
    }; 

    var creq = http.request(options, function(cres) { 

     res.setHeader('Content-Type', 'multipart/x-mixed-replace;boundary="' + boundary + '"'); 
     res.setHeader('Connection', 'close'); 
     res.setHeader('Pragma', 'no-cache'); 
     res.setHeader('Cache-Control', 'no-cache, private'); 
     res.setHeader('Expires', 0); 
     res.setHeader('Max-Age', 0); 

    // wait for data 
    cres.on('data', function(chunk){ 
     res.write(chunk); 
    }); 

    cres.on('close', function(){ 
     // closed, let's end client request as well 
     res.writeHead(cres.statusCode); 
     res.end(); 
    }); 

    }).on('error', function(e) { 
    // we got an error, return 500 error to client and log error 
    console.log(e.message); 
    res.writeHead(500); 
    res.end(); 
    }); 

    creq.end(); 

}); 
 

मैं इस/गति के रूप में 192.168.1.2:8302 पर mjpeg धारा में कार्य करता है लगता होगा , लेकिन यह नहीं करता है। शायद क्योंकि यह कभी समाप्त नहीं होता है, और यह प्रॉक्सी उदाहरण वास्तव में एक स्ट्रीमिंग उदाहरण नहीं था?

+0

आप इसके बजाय nginx का उपयोग कर देख सकते हैं। – david

+2

इसे एक नोड समाधान होना चाहिए – skerit

उत्तर

1

HTTP पर स्ट्रीमिंग समस्या नहीं है। मैं नियमित रूप से नोड के साथ ऐसा करता हूं। मुझे लगता है कि आपके पास जो समस्या है वह यह है कि आप क्लाइंट को सामग्री प्रकार शीर्षलेख नहीं भेज रहे हैं। वास्तव में, कोई प्रतिक्रिया शीर्षलेख भेजने के बिना आप डेटा लिखने के लिए सही हो जाते हैं।

कोई वास्तविक सामग्री डेटा भेजने से पहले, ग्राहक को अनुरोध करने के लिए सही सामग्री प्रकार शीर्षलेख वापस भेजना सुनिश्चित करें।

यदि आपको नोड का HTTP क्लाइंट पहले से ही आपके लिए नहीं करता है तो आपको handle multipart responses की आवश्यकता हो सकती है।

इसके अलावा, मैं इसे वायरसहार्क के साथ डीबग करने की सलाह देता हूं ताकि आप वास्तव में देख सकें कि क्या भेजा जा रहा है और प्राप्त किया जा रहा है। इससे आपको इस तरह की समस्याओं को कम करने में मदद मिलेगी।

मुझे यह भी ध्यान रखना चाहिए कि कुछ ग्राहकों को चंकित एन्कोडिंग के साथ कोई समस्या है, जो नोड भेज देगा यदि आप सामग्री की लंबाई निर्दिष्ट नहीं करते हैं (जिसे आप अनिश्चित नहीं कर सकते हैं)। यदि आपको चंक किए गए एन्कोडिंग को अक्षम करने की आवश्यकता है, तो मेरा उत्तर यहां देखें: https://stackoverflow.com/a/11589937/362536 असल में, आपको बस इसे अक्षम करने की आवश्यकता है: response.useChunkedEncodingByDefault = false;। ऐसा तब तक मत करो जब तक आपको यद्यपि आवश्यकता न हो! और अपने हेडर में Connection: close भेजना सुनिश्चित करें!

+0

खंड-वस्तु mjpeg स्ट्रीम के लिए एक समस्या है। मुझे लगता है कि एक सामान्य जेपीईजी स्ट्रीम हमेशा एक पूरे हिस्से के रूप में काम किया जाता है। इसलिए मुझे एक पूरे फ्रेम की प्रतीक्षा करनी चाहिए और केवल तभी ग्राहक को भेजना चाहिए। – skerit

+1

आह, इसे मिला! मेरे प्रतिक्रिया शीर्षलेख में मुझे मूल mjpeg स्ट्रीम में उपयोग की जाने वाली मल्टीपार्ट सीमा सेट करने की आवश्यकता थी (जो गति में, हमेशा "बाउंडरीस्ट्रिंग" समान होता है) इस तरह से मैं इसे किसी भी डेटा को जोड़ने के बिना भाग को अग्रेषित कर सकता हूं। – skerit

0

आपको केवल एक थ्रेड में आवश्यक होने पर mjpeg स्ट्रीम का अनुरोध करना है और प्रत्येक क्लाइंट को mjpeg या jpeg (यदि आपको IE समर्थन की आवश्यकता है) के साथ प्रतिक्रिया दें।