2013-01-07 9 views
5

Cerco di far funzionare Parrot AR Drone 2.0 con una macchina Windows.Mostra un flusso video TCP (da FFPLAY/FFMPEG) in un'applicazione C#

Ho una semplice applicazione C# per controllarlo - ma ora voglio il flusso video all'interno della mia applicazione.

Se eseguo ffplay tcp://192.168.1.1:5555 si collega al videostream e mostra una finestra con il video.

Come posso ottenere questo video nella mia applicazione? Ad esempio, un semplice "frame" o "immagine" che si riempie di quel contenuto?

Non ho mai lavorato così tanto con C# quindi qualsiasi aiuto sarebbe fantastico.

+1

Quale codice avete finora per fare questo ..? – MethodMan

+0

controlla questo link e guarda la documentazione che può o non può aiutare .. http://gstreamer.freedesktop.org/ – MethodMan

+0

http://dronecontroller.codeplex.com/ – MethodMan

risposta

0

Avete provato lo streaming con il lettore multimediale? Basta aggiungere il controllo dalla casella degli strumenti nel modulo e quindi aggiungere il codice seguente al tuo form.cs

private void Form1_Load(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.URL = "your URL"; 
    } 
} 

dettagli al seguente link

http://msdn.microsoft.com/en-us/library/bb383953%28v=vs.90%29.aspx 
+0

bene, che potrebbe funzionare .. Ci proverò stasera. Ma immagino che questo non sia un flusso diretto e avrò un po 'più di latenza in questo modo. Tornerò a te stasera! –

+0

hai avuto fortuna con il video? – idipous

3

è possibile avviare il processo di ffplay e poi PInvoke SetParent per posizionare la finestra del lettore all'interno del modulo e MoveWindow per posizionarlo.

Per fare ciò è necessario definire quanto segue.

[DllImport("user32.dll", SetLastError = true)] 
private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 

[DllImport("user32.dll")] 
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

Quindi è possibile utilizzare i due metodi nativi in ​​questo modo.

// start ffplay 
var ffplay = new Process 
    { 
     StartInfo = 
      { 
       FileName = "ffplay", 
       Arguments = "tcp://192.168.1.1:5555", 
       // hides the command window 
       CreateNoWindow = true, 
       // redirect input, output, and error streams.. 
       RedirectStandardError = true, 
       RedirectStandardOutput = true, 
       UseShellExecute = false  
      } 
    }; 

ffplay.EnableRaisingEvents = true; 
ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay"); 
ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay"); 
ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay"); 
ffplay.Start(); 

Thread.Sleep(200); // you need to wait/check the process started, then... 

// child, new parent 
// make 'this' the parent of ffmpeg (presuming you are in scope of a Form or Control) 
SetParent(ffplay.MainWindowHandle, this.Handle); 

// window, x, y, width, height, repaint 
// move the ffplayer window to the top-left corner and set the size to 320x280 
MoveWindow(ffplay.MainWindowHandle, 0, 0, 320, 280, true); 

L'output standard del processo ffplay, il testo di solito si vede nella finestra di comando viene gestita tramite ErrorDataReceived. L'impostazione di -loglevel su qualcosa come fatal negli argomenti passati a ffplay consente di ridurre la quantità di eventi generati e consente di gestire solo errori reali.

+0

Provi entrambi i metodi domani! –

+0

Non preoccuparti, ho anche aggiunto come si acquisisce il testo di output nel codice gestito dal processo, consentendo di gestire gli errori, ecc. – Fraser

+1

Molto bello! Grazie :) Un sacco di volantini ARDrone ti ringrazieranno se questo funziona bene! –

Problemi correlati