2017-09-04 1 views
0

J'essaie de diffuser un flux vidéo d'un Raspberry Pi à ma machine en utilisant python. Par conséquent, j'ai besoin de connecter une socket au serveur. (vidéo en streaming directement à 192.168.0.6:8081 de RPi avant d'exécuter ces)OSError: [WinError 10049] Comment gérer cette erreur?

Sur mon ordinateur j'exécute ce code:

import numpy as np 
import cv2 
import socket 


class VideoStreamingTest(object): 

    def __init__(self): 
     self.server_socket = socket.socket() 
     self.server_socket.bind(('192.168.0.6', 8081)) 
     self.server_socket.listen(0) 
     self.connection, self.client_address = self.server_socket.accept() 
     self.connection = self.connection.makefile('rb') 
     self.streaming() 

def streaming(self): 
    try: 
     print ("Connection from: ", self.client_address) 
     print ("Streaming...") 
     print ("Press 'q' to exit") 

     stream_bytes = ' ' 
     while True: 
      stream_bytes += self.connection.read(1024) 
      first = stream_bytes.find('\xff\xd8') 
      last = stream_bytes.find('\xff\xd9') 
      if first != -1 and last != -1: 
       jpg = stream_bytes[first:last + 2] 
       stream_bytes = stream_bytes[last + 2:] 
       #image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_GRAYSCALE) 
       image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_UNCHANGED) 
       cv2.imshow('image', image) 

       if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
    finally: 
     self.connection.close() 
     self.server_socket.close() 

if __name__ == '__main__': 
    VideoStreamingTest() 

Au cours de la compilation soulève cette erreur:

Traceback (most recent call last): 

File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 43, in <module> 
    VideoStreamingTest() 

File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 11, in __init__ 
    self.server_socket.bind(('192.168.0.6', 8081)) 

OSError: [WinError 10049] The requested address is not valid in its context 

EDIT: Cela donne également

Traceback (most recent call last): 
    File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 47, in 
<module> 
    VideoStreamingTest() 
    File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 17, in 
__init__ 
self.connection = self.socket.create_connection(('192.168.0.6', 8081)) 
AttributeError: 'socket' object has no attribute 'create_connection' 

Alors j'ai essayé de re placer create_connection avec connect_ex et il est toujours donner erros .. :(

class VideoStreamingTest(object): 
    def __init__(self): 

    #self.server_socket = socket.socket() 
    #self.server_socket.bind(('192.168.0.6', 8081)) 
    #self.server_socket.listen(0) 

    #self.connection, self.client_address = self.server_socket.accept() 
    #self.connection = self.connection.makefile('rb') 
    #self.streaming() 
    self.socket = socket.socket() 
    self.connection = self.socket.create_connection(('192.168.0.6', 8081)) 
    #self.socket.connect(('192.168.0.6', 8081)) 
    self.streaming() 

def streaming(self): 

    try: 
     #print ("Connection from: ", self.client_address) 
     print ("Streaming...") 
     print ("Press 'q' to exit") 

     stream_bytes = ' ' 
     while True: 
      stream_bytes += self.connection.read(1024) 
      first = stream_bytes.find('\xff\xd8') 
      last = stream_bytes.find('\xff\xd9') 
      if first != -1 and last != -1: 
       jpg = stream_bytes[first:last + 2] 
       stream_bytes = stream_bytes[last + 2:] 
       #image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_GRAYSCALE) 
       image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_UNCHANGED) 
       cv2.imshow('image', image) 

       if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
    finally: 
     self.connection.close() 
     self.socket.close() 

if __name__ == '__main__': 
    VideoStreamingTest() 
+1

'192.168.0.6' est l'adresse IP distante, correcte? 'socket.bind()' nécessite une adresse assignée à votre hôte local. – birryree

+0

ya son adresse IP de la framboise pi –

Répondre

0

Vous devez changer l'adresse IP dans la commande bind de la prise à l'adresse IP du périphérique qui offre le serveur, à savoir l'adresse de votre propre pc. Le code que vous avez posté ici ne va pas faire ce que vous voulez faire: il va créer un nouveau server et n'agira pas comme un client qui peut se connecter à un serveur!

Ces lignes

self.server_socket.bind(('192.168.0.6', 8081)) 
self.server_socket.listen(0) 

doivent être remplacés par

self.socket.connect(('192.168.0.6', 8081)) 

Edit: Peut-être qu'il est préférable d'utiliser la fonction create_connection, car il fonctionne sur un niveau de l'API supérieur. Donc, vous finirez avec cette méthode d'initialisation:

def __init__(self): 
    self.socket = socket.socket() 
    self.connection, _ = self.socket.create_connection(('192.168.0.6', 8081)) 
    self.streaming() 

Dans la méthode streaming vous devez alors supprimer cette ligne, aussi:

print ("Connection from: ", self.client_address) 
+0

Je vais essayer tout de suite, je vous ferai savoir si cela fonctionne! Merci beaucoup! –

+0

@MohdSalman Si cela vous a aidé, veuillez voter pour ma réponse, et la marquer comme la réponse à votre question. – FlashTek

+0

Erreur: retraçage (le plus récent appel dernier): fichier "C: /Users/tiger/Desktop/take_the_stream_from_pi.py", ligne 44, dans VideoStreamingTest() du fichier « C:/Users/Tiger/Desktop /take_the_stream_from_pi.py ", ligne 13, dans __init__ self.socket.connect (('192.168.0.6', 8081)) AttributeError: L'objet 'VideoStreamingTest' n'a pas d'attribut 'socket' –