2010-01-13 15 views
6

पर काम नहीं कर रहा है मेरे पास एक एएसपी.NET एप्लिकेशन है जिसे मुझे सुरक्षा कैमरे से वीडियो फ़ीड दिखाने की ज़रूरत है। वीडियो फीड में एक सामग्री प्रकार 'मल्टीपार्ट/एक्स-मिश्रित-प्रतिस्थापन है; सीमा = - myboundary 'सीमाओं के बीच छवि डेटा के साथ। मुझे अपने पृष्ठ पर डेटा की उस धारा को पारित करने में सहायता की आवश्यकता है ताकि क्लाइंट साइड प्लगइन मैं स्ट्रीम का उपभोग कर सकूं जैसे कि अगर मैं कैमरे के वेब इंटरफ़ेस पर सीधे ब्राउज़ करता। निम्नलिखित कोड काम नहीं करता:एमजेपीईजी और मल्टीपार्ट/एक्स-मिश्रित-प्रतिस्थापन के साथ HttpWebResponse; सीमा = - सुरक्षा कैमरे से myboundary प्रतिक्रिया सामग्री प्रकार

//Get response data 
byte[] data = HtmlParser.GetByteArrayFromStream(response.GetResponseStream()); 
if (data != null) 
{ 
HttpContext.Current.Response.OutputStream.Write(data, 0, data.Length); 
} 
return; 

उत्तर

12

ठीक है, अगर आप अपने क्लाइंट को mjpeg स्ट्रीम देखना चाहते हैं, तो आपको संपूर्ण http प्रतिक्रिया भेजनी होगी।

HTTP/1.1 200 OK 
Content-Type: multipart/x-mixed-replace; boundary=myboundary 

--myboundary 
Content-Type: image/jpeg 
Content-length: 12345 

[image 1 encoded jpeg data] 


--myboundary 
Content-Type: image/jpeg 
Content-length: 45678 

[image 2 encoded jpeg data] 

... 

नोट:: Ergousha के रूप में एक जवाब में कहा, आप सामग्री-लंबाई क्षेत्र के बाद एक खाली पंक्ति होना आवश्यक है ब्राउज़र या वीएलसी मीडिया प्लेयर की तरह की तरह HTTP ग्राहक एक mjpeg धारा है कि तरह लग रहा है की जरूरत है।

वैसे, क्यों अपने क्लाइंट को सीधे mjpeg स्ट्रीम पर रीडायरेक्ट नहीं करें?

उदाहरण के लिए आप http://ipcam/mjpg/video.mjpg एक्सिस आईपी कैमरे का उपयोग कर सकते हैं।

यदि आपको केवल HTTP के माध्यम से छवि की आवश्यकता है, तो आपको सही शीर्षलेख और MIME सामग्री-प्रकार छवि/जेपीईजी सेट करना होगा। छवि को डीकोड करने के लिए, आपको बाइट डेटा प्राप्त करना होगा और आपको जेपीईजी एन्कोडिंग मिल जाएगी। फिर आपको एक विशिष्ट प्रारूप में एक छवि प्राप्त करने के लिए जेपीईजी को डीकोड करना होगा (कुछ ऐसा लगता है जैसे yuv420p मुझे लगता है)। मैंने अपने आईपी कैमरे पर जांच की है, और इसकी स्ट्रीम बेस 64 एन्कोडेड नहीं है जो मुझे लगता है।

अपनी ज़रूरतों को पूरा करें, मैं और अधिक मदद करने की कोशिश करूंगा।

my2c

संपादित करें:

client : connect to proxy, 
      get example.com/camera1.mjpg, 
      while not the end 
       recv 


yourproxy : wait connection 
      connect to camera, 
      get 10.0.0.123/camera1.mjpg 
      while not the end 
       recv buffer 
       copy buffer 
       send buffer to client 

कहना है कि है कि आप अपने ग्राहक के लिए सही हेडर भेजना चाहिए:

ठीक है, मैं आप की तरह कुछ करने लगता है। यह सुनिश्चित करने के लिए कि पैकेट पर जासूसी करने के लिए वायरसहार्क जैसे टूल का उपयोग करें और सुनिश्चित करें कि आपके क्लाइंट ने एचटीटीपी जीईटी जारी करने के बाद आपको सही एमजेपीईजी स्ट्रीम भेज दिया है (जैसा कि मैंने अपनी पोस्ट की शुरुआत में वर्णन किया है ...)

m2c

+0

जो वही है जो मैं करना चाहता हूं। मैं उपयोगकर्ता को सीधे mjpeg स्ट्रीम पर रीडायरेक्ट नहीं कर सकता क्योंकि मेरा एप्लिकेशन रिवर्स प्रॉक्सी के रूप में काम कर रहा है। तो मुझे कैमरे से स्ट्रीम प्राप्त करने की आवश्यकता है और फिर इसे मेरे आवेदन में एक यूआरएल के जवाब के रूप में भेज दें। तो HTTP क्लाइंट http://example.com/camera1 पर कॉल करता है।mjpg मेरा सर्वर अनुरोध को पार करता है और http1//10.1.1.240/mjpg/video.mjpg पर कैमरा 1 को कॉल करता है, फिर मुझे क्लाइंट को प्रतिक्रिया स्ट्रीम करने की आवश्यकता होती है। तो यह वह जगह है जहां मुझे यह पता लगाने में कठिनाई हो रही है कि क्लाइंट को एमजीजीपी को वापस कैसे स्ट्रीम किया जाए। –

+0

अपनी कठिनाइयों के बारे में अधिक सटीक बनें। अपने कोड स्निपेट को देखते हुए, ऐसा लगता है कि आप प्रतिक्रिया का केवल एक हिस्सा पढ़ते हैं। HTTP/MJPEG के साथ आपको लगातार टीसीपी पैकेट पढ़ने और उन्हें भेजने के लिए, इसलिए मेरे उत्तर में छद्म कोड है। मुझे लगता है कि GetByteArrayFromStream कॉल आंशिक रूप से डेटा को पढ़ता है, इसलिए आप अपने क्लाइंट को केवल आंशिक डेटा भेजते हैं। जब तक यह बंद नहीं हो जाता तब तक आपको टीसीपी चैनल पर पढ़ना होगा! जांचें कि आप क्या प्राप्त करते हैं/वायरसहार्क के साथ आप क्या भेजते हैं, आपके पास जमीन की सच्चाई होगी। अगर मैं आपकी समस्या को गलत समझता हूं, तो इसे सटीक करें, कृपया ... – neuro

+0

हां, मुझे पूरा यकीन है कि हमें थोड़ा गहराई से जाना होगा और 'टीसीपी क्लाइंट' जैसे कम सार तत्वों का उपयोग करना होगा। मैं वर्तमान में @ arri.me जैसा ही काम करने की कोशिश कर रहा हूं! –

0

छवि डेटा की एन्कोडिंग क्या है? क्या यह बेस 64 है?

असल में आपको प्रतिक्रिया से छवि डेटा को पार्स करना होगा, बेस 64 इसे बाइट्स में डीकोड करें, और उसके बाद छवि को क्लाइंट को भेजें।

+0

नहीं, क्योंकि स्ट्रीम को क्लाइंट को mjpeg के रूप में अग्रेषित किया जाना है। डीकोड/एन्कोड करने की कोई ज़रूरत नहीं है :) – neuro

3

mjpeg स्ट्रीम कैसा दिखता है इस बारे में अच्छी व्याख्या। मैं एक टिप जोड़ना चाहता हूं; वास्तविक डेटा से पहले हमेशा 2 नए रेखा वर्ण होते हैं। यदि आप इसे एक लाइन बनाते हैं, तो यह काम नहीं करता है।

 string header = 
      "--myboundary\r\n" + 
      "Content-Type:image/jpeg\r\n" + 
      "Content-Length:" + length.ToString() + "\r\n\r\n"; 
+0

धन्यवाद, और अच्छी परिशुद्धता। मैं इसे जोड़ दूंगा ... – neuro

संबंधित मुद्दे