Pregunta

quería obtener algunas ideas de cómo uno algunos de ustedes abordar este problema. Tengo un robot, que ejecuta Linux y utiliza una cámara web (con un conductor v4l2) como uno de sus sensores. He escrito un panel de control con gtkmm. Tanto el servidor y el cliente están escritas en C ++. El servidor es el robot, el cliente es el "panel de control". El análisis de imágenes está sucediendo en el robot, y me gustaría volver a transmitir el vídeo de la cámara al panel de control por dos razones: A) para la diversión B) para superponer los resultados de análisis de imagen

Así que mi pregunta es, ¿cuáles son algunas buenas formas de transmisión de vídeo de la cámara web al panel de control, así como dar prioridad al código de robot para procesarlo? No me interesa que escribir mi propio esquema de compresión de vídeo y ponerlo a través del puerto de red existente, un nuevo puerto de red (dedicada a los datos de vídeo) sería mejor que pienso. La segunda parte del problema es cómo puedo mostrar vídeo en gtkmm? Los datos de vídeo llega de forma asíncrona y no tener control sobre main () en gtkmm así que creo que sería difícil.

Estoy abierto a cosas como el uso de VLC, gstreamer o cualquier otra biblioteca de compresión en general no sé acerca.

Gracias!

EDIT: El robot tiene un procesador de 1 GHz, la ejecución de un escritorio como la versión de Linux, pero sin X11.

¿Fue útil?

Solución

Gstreamer resuelve casi todo esto para usted, con muy poco esfuerzo, y también se integra muy bien con el sistema de eventos Glib. GStreamer incluye plugins de origen V4L, widgets GTK + salida, varios filtros para cambiar el tamaño / codificación / decodificación del vídeo, y lo mejor de todo, el fregadero de la red y las fuentes para mover los datos entre máquinas.

En el prototipo, puede utilizar la herramienta 'GST-lanzamiento' para montar tuberías de vídeo y prueba de ellos, entonces es bastante simple para crear tuberías mediante programación en el código. Búsqueda de 'red GStreamer streaming' para ver ejemplos de personas que hacen esto con cámaras web y similares.

Otros consejos

No estoy seguro acerca de las tecnologías actuales utilizadas, pero esto puede llegar a ser una gran sincronización ***** si se quiere evitar pérdida de fotogramas. Estaba Transmisión de un video en un archivo y red al mismo tiempo. Lo que finalmente terminó haciendo fue el uso de un buffer circular grande con tres punteros: uno de escritura y lectura de dos. Había tres hilos de control (y algunos hilos de codificación adicionales): una escritura a la memoria intermedia que hacer una pausa si se alcanza un punto en el tampón no leído por tanto de las otras, y dos hilos lector que leídos de la memoria intermedia y escribir en el archivo / red (y si consiguieron hacer una pausa antes del productor). Ya que todo se escribe y se lee como marcos, los gastos generales de sincronización podría mantenerse al mínimo.

Mi productor era un transcodificador (de otra fuente de archivos), pero en su caso, es posible que desee la cámara para producir tramas enteras en cualquier formato que lo hace normalmente y sólo hacer la transcodificación (con algo como ffmpeg) para el servidor, mientras que el robot procesa la imagen.

Su problema es un poco más complejo, sin embargo, ya que el robot necesita información en tiempo real lo que no puede hacer una pausa y esperar a que el servidor de streaming para ponerse al día. Así que es posible que desee obtener marcos al sistema de control lo más rápido posible y amortiguar algunos hasta en un buffer circular por separado para la transmisión al "panel de control". Ciertos códecs manejan mejor que otros marcos cayeron, por lo que si la red se pone detrás de usted puede comenzar a sobrescribir los marcos al final de la memoria intermedia (teniendo cuidado de que no están siendo leídos).

Cuando se dice 'un nuevo puerto de vídeo' y luego empezar a hablar de VLC / gstreaming Me resulta difícil averiguar lo que quiere. Obviamente, estos paquetes de software ayudarán en streaming y compresión a través de una serie de protocolos pero es evidente que se necesita un 'puerto de red' no es un 'puerto de vídeo' para enviar la corriente.

Si lo que realmente quiere decir es el envío de salida de la pantalla a través de video inalámbrico de alimentación / tv esa es otra cuestión, sin embargo, que necesita el asesoramiento de expertos en hardware en lugar de software expertos en eso.

Pasando. He hecho un montón de streaming a través de protocolos MMS / UDP y VLC lo maneja muy bien (como servidor y cliente). Sin embargo está diseñado para equipos de sobremesa y puede que no sea tan ligero como desee. Algo así como GStreamer, ffmpeg o mencoder en la mano sobre la que va a ser mejor, creo. ¿Qué tipo de CPU tiene el robot? Usted necesitará un poco de ronco si usted está planeando compresión en tiempo real.

En el lado del cliente creo que encontrará una serie de widgets para manejar el vídeo en GTK. Me gustaría ver en que antes de preocuparse por detalles de la interfaz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top