Question

Je voulais obtenir quelques idées une façon dont certains d'entre vous aborder ce problème. J'ai un robot, qui exécute Linux et utilise une webcam (avec un pilote v4l2) comme l'un de ses capteurs. J'ai écrit un panneau de commande avec gtkmm. Le serveur et le client sont écrits en C ++. Le serveur est le robot, le client est le « panneau de commande ». L'analyse de l'image se passe sur le robot, et je voudrais diffuser de la vidéo à partir de la caméra au panneau de commande pour deux raisons: A) pour le plaisir B) pour superposer les résultats d'analyse d'images

Alors, ma question est, quelles sont les bonnes façons de diffuser de la vidéo de la webcam au panneau de contrôle, ainsi que de donner la priorité au code du robot pour le traiter? Je ne suis pas intéressé à écrire mon propre ce système de compression vidéo et de le mettre à travers le port réseau existant, un nouveau port réseau (dédié aux données vidéo) serait mieux que je pense. La deuxième partie du problème est de savoir comment puis-je afficher la vidéo en gtkmm? Les données vidéo arrive de manière asynchrone et je ne pense pas que je contrôle sur main () gtkmm donc ce serait difficile.

Je suis ouvert à l'utilisation des choses comme vlc, GStreamer ou d'autres bibliothèques de compression générale, je ne sais pas.

merci!

EDIT: Le robot dispose d'un processeur cadencé à 1 GHz, l'exécution d'un ordinateur de bureau comme version de linux, mais pas X11.

Était-ce utile?

La solution

Gstreamer résout presque tout cela pour vous, avec très peu d'effort, et intègre aussi bien avec le système d'événements Glib. GStreamer inclut les plugins source V4L, widgets GTK + sortie, différents filtres pour redimensionner / encoder / décoder la vidéo et le meilleur de tous, d'un évier de réseau et les sources pour déplacer les données entre les machines.

Pour prototype, vous pouvez utiliser l'outil « gst-launch » pour assembler les pipelines vidéo et de les tester, il est assez simple de créer des pipelines dans votre code programatically. Rechercher « réseau GStreamer streaming » pour voir des exemples de gens qui font cela avec les webcams et autres.

Autres conseils

Je ne sais pas sur les technologies actuelles utilisées, mais cela peut finir par être une énorme synchronisation ***** si vous voulez éviter des pertes d'images. Je ruisselais une vidéo dans un fichier et réseau en même temps. Ce que je finalement fini par faire était l'aide d'un grand tampon circulaire avec trois pointeurs: une écriture et deux lectures. Il y avait trois fils de commande (et quelques fils d'encodage supplémentaires): une écriture à la mémoire tampon qui pause si elle a atteint un point dans la mémoire tampon non lu par les deux autres, et deux fils de lecteur qui lues dans la mémoire tampon et écrire à le fichier / réseau (et faire une pause si elles se sont en avance sur le producteur). Puisque tout a été écrit et lu en tant que cadres, les frais généraux de synchronisation peut être réduite au minimum.

Mon producteur était un transcodeur (à partir d'une autre source de fichiers), mais dans votre cas, vous voudrez peut-être l'appareil photo pour produire des images entières dans quel format il ne normalement et seulement les transcoder (avec quelque chose comme ffmpeg) pour le serveur, tandis que le robot traite l'image.

Votre problème est un peu plus complexe, mais, étant donné que le robot a besoin de rétroaction en temps réel ne peut donc pas faire une pause et attendre que le serveur de streaming pour rattraper. Donc, vous pouvez obtenir des images au système de contrôle le plus rapidement possible et dans une mémoire tampon un tampon circulaire séparément pour la diffusion au « panneau de commande ». Certains codecs manipuler de saccades ou mieux que d'autres, donc si le réseau se place derrière vous pouvez commencer à écraser les cadres à la fin du tampon (en prenant soin qu'ils ne sont pas en cours de lecture).

Quand vous dites « un nouveau port vidéo », puis commencer à parler de vlc / gstreaming Je trouve qu'il est difficile de travailler sur ce que vous voulez. Il est évident que ces logiciels contribueront à la diffusion et la compression par un certain nombre de protocoles mais il est clair que vous aurez besoin d'un « port réseau » pas un « port vidéo » pour envoyer le flux.

Si ce

vous vraiment envoie la sortie d'affichage via flux vidéo / TV sans fil est une autre affaire, mais vous aurez besoin des conseils d'experts matériels plutôt que des experts en logiciels sur ce point.

Sur la route. Je l'ai fait beaucoup de streaming via MMS / UDP et vlc très bien poignées (comme serveur et client). Toutefois, il est conçu pour les ordinateurs de bureau et peut ne pas être aussi léger que vous le souhaitez. Quelque chose comme GStreamer, mencoder ou ffmpeg sur la main sur va être mieux, je pense. Quel type de CPU ne le robot a? Vous aurez besoin d'un peu de grognement si vous envisagez la compression en temps réel.

Du côté client, je pense que vous trouverez un certain nombre de widgets pour gérer la vidéo en GTK. Je regarderais dans cette avant de se soucier des détails de l'interface.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top