comment envoyer une vidéo en direct sur le réseau en python

J'essaie d'envoyer une vidéo du client au serveur et de la montrer côté serveur. le problème est que lorsque j'exécute le code, j'obtiens une fenêtre de non-réponse vide!

voici le code que j'utilise que j'ai trouvé ici https://stackoverflow.com/a/30988516/4663461

client.py

import cv2
import numpy as np
import socket
import sys
import pickle
import struct
cap=cv2.VideoCapture(path_to_video)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8089))
while True:
ret,frame=cap.read()
data = pickle.dumps(frame)
clientsocket.sendall(struct.pack("L", len(data))+data)

serveur.py

import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST=''
PORT=8089
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print ('Socket created')
s.bind((HOST,PORT))
print ('Socket bind complete')
s.listen(10)
print ('Socket now listening')
conn,addr=s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
###
frame=pickle.loads(frame_data)
print frame
cv2.imshow('frame',frame)


Solution du problème

Je suis un peu en retard, mais j'ai créé une bibliothèque python de traitement vidéo VidGear puissante et filetée qui fournit désormais l' API NetGear, qui est exclusivement conçue pour transférer des images vidéo de manière synchrone entre des systèmes interconnectés sur le réseau en temps réel via le système de messagerie ZmQ. Voici un exemple minimal pour votre commodité :

A. Fin du serveur : (exemple du strict minimum)

Ouvrez votre terminal préféré et exécutez le code python suivant :

Remarque : Vous pouvez mettre fin à la diffusion à tout moment côté serveur et côté client en appuyant sur [Ctrl+c] sur votre clavier côté serveur !

# import libraries
from vidgear.gears import VideoGear
from vidgear.gears import NetGear
stream = VideoGear(source='test.mp4').start() #Open any video stream
server = NetGear() #Define netgear server with default settings
# infinite loop until [Ctrl+C] is pressed
while True:
try:
frame = stream.read()
# read frames
# check if frame is None
if frame is None:
#if True break the infinite loop
break
# do something with frame here
# send frame to server
server.send(frame)
except KeyboardInterrupt:
#break the infinite loop
break
# safely close video stream
stream.stop()
# safely close server
writer.close()

B. Client End : (exemple du strict minimum)

Ouvrez ensuite un autre terminal sur le même système et exécutez le code python suivant et voyez le résultat :

# import libraries
from vidgear.gears import NetGear
import cv2
#define netgear client with `receive_mode = True` and default settings
client = NetGear(receive_mode = True)
# infinite loop
while True:
# receive frames from network
frame = client.recv()
# check if frame is None
if frame is None:
#if True break the infinite loop
break
# do something with frame here
# Show output window
cv2.imshow("Output Frame", frame)
key = cv2.waitKey(1) & 0xFF
# check for 'q' key-press
if key == ord("q"):
#if 'q' key-pressed break out
break
# close output window
cv2.destroyAllWindows()
# safely close client
client.close()

Remarque: NetGear ne prend actuellement en charge que deux modèles de messagerie ZeroMQ : c'est-à-dire zmq.PAIRet zmq.REQ and zmq.REPet les protocoles pris en charge sont :'tcp', 'upd', 'pgm', 'inproc', 'ipc'

Une utilisation plus avancée peut être trouvée ici : https://github.com/abhiTronix/vidgear/wiki/NetGear

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"