Cómo procesar el flujo de VLC UDP sobre OpenCV

Pude recibir / ver paquetes UDP h264 a través de la línea de comandos VLC (es decir, VLC – almacenamiento en red 0 –demux h264 udp: // …)

Estoy planeando procesar esos marcos a través de algoritmos de OpenCV. Sin embargo, parece que no puedo encontrar una manera de enviar los marcos VLC a mi script de Python OpenCV.

¿Es posible canalizar la salida de flujo VLC para que se procese a través de Numpy en una secuencia de comandos separada?

Anteriormente, he intentado transmitir directamente a OpenCV utilizando su función VideoCapture, pero por alguna razón, el video se detiene y se detiene en una imagen negra distorsionada. Por ahora, parece que la incorporación de VLC es la única solución (aunque no estoy totalmente seguro de por qué VLC funciona por encima de otros métodos).

Gracias.

EDITAR:

El siguiente es un fragmento del mensaje de error en el terminal. Parece que hay problemas con los primeros cuadros, pero no sé por qué la transmisión funciona en VLC. Desde el cliente, primero envié un dato de fotogtwig clave predeterminado y luego envié datos de video h264.

[h264 @ 0x7f9c50020200] top block unavailable for requested intra mode -1 [h264 @ 0x7f9c50020200] error while decoding MB 7 0, bytestream 7208 [h264 @ 0x7f9c50020200] top block unavailable for requested intra mode -1 [h264 @ 0x7f9c50020200] error while decoding MB 8 9, bytestream 7381 

Puedes usar ffmpeg para streaming.

Primera prueba ffmpeg streaming en terminal. En Linux, usamos v4l2 para capturar fotogtwigs de la cámara.

Servidor :

 ffmpeg -f v4l2 -i /dev/video0 -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f h264 udp://127.0.0.1:5000 

Cliente :

 ffplay udp://127.0.0.1:5000 

Si puede ver la transmisión en el lado del cliente, podemos usar OpenCV para el procesamiento de imágenes. OpenCV debe tener soporte ffmepg. Vea este enlace para la verificación de soporte ffmpeg.

  cap = cv2.VideoCapture('udp://127.0.0.1:5000',cv2.CAP_FFMPEG) if not cap.isOpened(): print('VideoCapture not opened') exit(-1) while True: ret, frame = cap.read() if not ret: print('frame empty') break cv2.imshow('image', frame) if cv2.waitKey(1)&0XFF == ord('q'): break cap.release() cv2.destroyAllWindows()