2014-06-28 8 views
5

मेरे पास समर्पित कैमरे वाला रास्पबेरी पीआई बोर्ड है जो केवल एच 264 में वीडियो रिकॉर्ड करता है। मैं सी # विंडोज़ फॉर्म ऐप में वास्तविक समय में रिकॉर्ड किए गए वीडियो को स्ट्रीम और चलाने के लिए सबसे अच्छी विधि ढूंढ रहा हूं (जैसे, 1 सेकंड से भी कम देरी)। अतिरिक्त आवश्यकता यह है कि इस तरह की धारा को प्रदर्शित करने से पहले आसानी से संसाधित किया जा सकता है, उदाहरण के लिए छवि पर वस्तुओं की खोज के लिए।सी # ऐप में रास्पबेरी पीआई एच 264 स्ट्रीम चलाएं

सामग्री मैंने कोशिश की:

- सी # रूपों अनुप्रयोग में raspi और वीएलसी नियंत्रण < पर वीएलसी सर्वर - सरल उपाय, RTSP के साथ, लेकिन एक गंभीर दोष है, जो छवि में एक ~ 3sec देरी दिखाया गया है। मैं buffor आकार/विकल्प आदि के साथ इसे ठीक नहीं कर सकता

-, एनसी के साथ raspi पर एक सॉकेट बनाने सी # में कच्चे h264 डेटा प्राप्त करने और MPlayer दृश्यपटल के लिए इसे पारित < - अगर मैं बस raspivid शुरू | एनसी और लैपटॉप एनसी पर | mplayer, मुझे वही परिणाम मिलते हैं जो मुझे चाहिए, मुझे जो वीडियो मिलता है वह काफी वास्तविक समय है, लेकिन समस्या तब उत्पन्न होती है जब मैं C# में mplayer frontend बनाने की कोशिश करता हूं और nc.exe अनुकरण करता हूं। हो सकता है कि मैं h264 डेटा गलत कर रहा हूं (बस उन्हें stdin पर लिखें) या शायद कुछ और।

- का उपयोग कर https://github.com/cisco/openh264 < - मैं सब कुछ संकलित, लेकिन मैं भी नमूना vid.h264 डिकोड करने के लिए मैं h264dec.exe साथ raspi पर दर्ज, सी # में इसका उपयोग करने का उल्लेख नहीं नहीं मिल सकता है।

h264dec.exe vid.h264 

मुझे देता है त्रुटि संदेश:

h264dec.exe vid.h264 out.yuv 

यह जबकि, 0bytes out.yuv फ़ाइल का उत्पादन "। कोई इनपुट विन्यास फ़ाइल में निर्दिष्ट फ़ाइल"

- ffmpeg < - मैं ग # अनुप्रयोग में ffplay.exe प्लेबैक लागू किया लेकिन आसान विधि की कमी screencaps लेने के लिए आदि मुझे आगे जांच करेंगे और विकसित करने के लिए हतोत्साहित किया।

मुझे यह भी यकीन नहीं है कि मैं इस विषय पर सही तरीके से आ रहा हूं, इसलिए मैं सलाह के हर टुकड़े के लिए वास्तव में आभारी हूं।

संपादित यहाँ मेरी 'काम कर रहे' समाधान मैं सी # में लागू करने के लिए कोशिश कर रहा हूँ है

raspivid --width 400 --height 300 -t 9999999 --framerate 25 --output - | nc -l 5884 

nc ip_addr 5884 | mplayer -nosound -fps 100 -demuxer +h264es -cache 1024 - 

कुंजी यहाँ, एफपीएस 100 है क्योंकि तब MPlayer स्किप के अंतराल और वीडियो इसे तुरंत सामान्य से प्राप्त करता है निभाता है गति। यहां मुद्दा यह है कि मुझे नहीं पता कि सॉकेट से वीडियो डेटा को cplay के माध्यम से mplayer में कैसे पास किया जाए, क्योंकि मुझे लगता है कि यह stdin (पहले से ही कोशिश की गई) के माध्यम से नहीं किया जाता है। जैसा कि मैंने पहले कहा -fps 120 विकल्प खिलाड़ी को छोड़ क्या buffor में है और जैसे ही यह उसे प्राप्त धारा खेलने बनाने के लिए है

:

उत्तर

4

ठीक है, तो वास्तव में मैं इस का समाधान करने में कामयाब रहे। पैनलआईडी एक पैनल का एक संभाल है जिसमें mplayer घोंसला है।

class Mplayer 
{ 
    Process mplayer; 

    public Mplayer(string path, string pipeName, int panelId) 
    { 
     String args = ""; 
     mplayer = new Process(); 
     mplayer.StartInfo.UseShellExecute = false; 
     mplayer.StartInfo.RedirectStandardInput = true; 
     mplayer.StartInfo.FileName = path; 
     args = @"\\.\pipe\" + pipeName + " -demuxer +h264es -fps 120 -nosound -cache 512"; 
     args += " -nofs -noquiet -identify -slave "; 
     args += " -nomouseinput -sub-fuzziness 1 "; 
     args += " -vo direct3d, -ao dsound -wid "; 
     args += panelId; 
     mplayer.StartInfo.Arguments = args; 
    } 

    public void Start() 
    { 
     mplayer.Start(); 
    } 

    public void End() 
    { 
     mplayer.Kill(); 
    } 
} 

सॉकेट से पृष्ठभूमि कार्यकर्ता पढ़ने सामान:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      pipeServ.WaitForConnection(); //opcjonalne? 
      StreamWriter sw = new StreamWriter(pipeServ); 
      sw.AutoFlush = true; 

      tcpCamera = new TcpClient(); 
      tcpCamera.Connect(ipAddress, camPort); 
      NetworkStream camStream = tcpCamera.GetStream(); 

      int read = 0; 
      byte[] bytes = new byte[tcpCamera.ReceiveBufferSize]; 
      while (tcpCamera.Connected) 
      { 
       read = camStream.Read(bytes, 0, tcpCamera.ReceiveBufferSize); 
       if (read > 0) 
        pipeServ.Write(bytes, 0, read); 
      } 
     } 
     catch (IOException ex) 
     { 
      //Broken pipe - result of Mplayer exit 
      //MessageBox.Show(ex.Message); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

स्क्रिप्ट रास्पबेरी पाई पर चल रहा है। पोर्टनंबर पोर्ट रस्सी की संख्या सुन रहा है।

#!/bin/bash 

raspivid --width 1280 --height 720 -t 9999999 --framerate 25 --output - | nc -l PORTNUMBER 
संबंधित मुद्दे