Frage

Ich wollte einige Ideen machen, wie einige von Ihnen dieses Problem angehen würden. Ich habe einen Roboter, der Linux ausführt und eine Webcam (mit einem V4L2 -Treiber) als einen seiner Sensoren verwendet. Ich habe ein Bedienfeld mit GTKMM geschrieben. Sowohl der Server als auch der Client sind in C ++ geschrieben. Der Server ist der Roboter, Client ist das "Bedienfeld". Die Bildanalyse findet auf dem Roboter statt, und ich möchte das Video aus zwei Gründen aus der Kamera in das Bedienfeld zurückstreamen

Meine Frage ist also, was sind einige gute Möglichkeiten, Videos von der Webcam in das Bedienfeld zu streamen und dem Robotercode Priorität zu geben, um ihn zu verarbeiten? Ich bin nicht interessiert, dass es mein eigenes Video -Komprimierungsschema schreibe und es über den vorhandenen Netzwerkport eingeräumt wird. Ein neuer Netzwerkport (der Videodaten gewidmet ist) am besten, denke ich. Der zweite Teil des Problems ist, wie ich Videos in GTKMM anzeige? Die Videodaten kommen asynchron und ich habe keine Kontrolle über Main () in GTKMM, daher denke ich, dass das schwierig wäre.

Ich bin offen für Dinge wie VLC, Gstreamer oder andere allgemeine Komprimierungsbibliotheken, von denen ich nichts weiß.

Danke!

Bearbeiten: Der Roboter verfügt über einen 1 -GHz -Prozessor, der einen Desktop -ähnlichen Linux -Version ausführt, aber kein X11.

War es hilfreich?

Lösung

Gstreamer löst fast all dies für Sie mit sehr wenig Aufwand und integriert sich auch gut in das GLIB -Ereignissystem. Gstreamer enthält V4L -Quell -Plugins, GTK+ Ausgangs -Widgets, verschiedene Filter zur Größe / Encode / Dekodierung des Videos sowie das Beste von allen Netzwerken und Quellen, um die Daten zwischen Maschinen zu verschieben.

Für Prototypen können Sie das Tool "GST-Launch" verwenden, um Video-Pipelines zusammenzustellen und zu testen. Anschließend wird einfach nur Pipelines programmatisch in Ihrem Code erstellt. Suchen Sie nach "Gstreamer -Netzwerk -Streaming", um Beispiele für Personen zu sehen, die dies mit Webcams und dergleichen tun.

Andere Tipps

I'm not sure about the actual technologies used, but this can end up being a huge synchronization ***** if you want to avoid dropped frames. Ich habe gleichzeitig ein Video in eine Datei und ein Netzwerk gestreamt. Was ich schließlich tat, war, einen großen kreisförmigen Puffer mit drei Zeigern zu verwenden: ein Schreiben und zwei lesen. Es gab drei Kontrollfäden (und einige zusätzliche Codierungs -Threads): eine Schrift in den Puffer, die innehalten würde, wenn es einen Punkt im Puffer erreichte die Datei/das Netzwerk (und pausieren Sie, wenn sie dem Produzenten vorausgegangen sind). Da alles als Frames geschrieben und gelesen wurde, konnte Sync Overhead auf ein Minimum gehalten werden.

Mein Produzent war ein Transcoder (aus einer anderen Dateiquelle), aber in Ihrem Fall möchten Sie möglicherweise verarbeitet das Bild.

Ihr Problem ist jedoch etwas komplexer, da der Roboter ein Echtzeit-Feedback benötigt. Sie können also nicht innehalten und warten, bis der Streaming-Server aufholt. Möglicherweise möchten Sie so schnell wie möglich Frames in das Steuerungssystem bringen und einige in einem kreisförmigen Puffer separat zum Streamen auf das "Bedienfeld" pufferen. Bestimmte Codecs -Griff -Frames besser als andere. Wenn das Netzwerk zurückkommt, können Sie am Ende des Puffers mit dem Überschreiben von Frames beginnen (wenn Sie darauf achten, dass sie nicht gelesen werden).

Wenn Sie "ein neuer Videoport" sagen und dann über VLC/Gstreaming sprechen, fällt es mir schwer, herauszufinden, was Sie wollen. Offensichtlich helfen diese Softwarepakete beim Streaming und Komprimieren über eine Reihe von Protokollen, aber Sie benötigen eindeutig einen "Netzwerkport", der keinen "Videoport" zum Senden des Streams gibt.

Wenn das, was Sie wirklich bedeuten, die Anzeigeausgabe über drahtlosen Video-/TV -Feeds zu senden, ist dies jedoch eine andere Angelegenheit, die Sie jedoch von Hardwareexperten und nicht von Softwareexperten dazu beraten müssen.

Weitermachen. Ich habe viel Streaming über MMS/UDP -Protokollen durchgeführt und VLC verarbeitet es sehr gut (als Server und Client). Es ist jedoch für Desktops ausgelegt und ist möglicherweise nicht so leicht wie Sie möchten. So etwas wie Gstreamer, Mencoder oder FFMPEG auf der Hand wird besser sein, denke ich. Welche Art von CPU hat der Roboter? Sie benötigen ein bisschen Grunzen, wenn Sie eine Echtzeitkomprimierung planen.

Auf der Client -Seite denke ich, dass Sie eine Reihe von Widgets finden, um Video in GTK zu verarbeiten. Ich würde mir das ansehen, bevor ich mich über Schnittstellendetails Sorgen machen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top