def startPlayFrames(self): self.grabando = not self.grabando; if(self.grabando): #Esto es para que podamos crear una ventana de video on pyqt, que la de opencv interfiere self.videoWidget = VideoWidget(); self.videoWidget.setWindowTitle(self.titulo); self.videoWidget.show(); print "Empezando a leer frames de la cola..." threadPlayFrames = threading.Thread(target=self.playFrames); threadPlayFrames.start();
class Video(): """ Función para inicializar el Video. Recibe mi información y la información del otro cliente de chat @param titulo El título de la ventana que muestra el chat """ def __init__(self,titulo,ipPropia,puertoPropio,ipRemota,puertoRemoto): self.titulo = titulo; self.ipPropia = ipPropia; self.puertoPropio = puertoPropio; self.ipRemoto = ipRemota; self.puertoRemoto = puertoRemoto; self.grabando = False; self.frames = []; #función que recibe un arreglo numpy de datos y lo pasa a una cadena de bytes def toString(self,data): f= StringIO() format.write_array(f,data) return f.getvalue() #función que recibe bytes y los pasa a una arreglo numpy de datos def toArray(self,s): f=StringIO(s) arr=format.read_array(f) return arr #Función que se cicla leyendo frames de la cola 'frames' y los despliega en pantalla def playFrames(self): print "Reproduciendo frames..." self.tiempoIni = time.time(); while(self.grabando): if len(self.frames) > 0: #le paso el frame al Widget self.videoWidget.paintFrame(self.frames.pop()); #self.grabando = self.tiempoIni + 15 > time.time(); #función que cambia el estado del objeto e inicializa un thread para leer frames de la cola def startPlayFrames(self): self.grabando = not self.grabando; if(self.grabando): #Esto es para que podamos crear una ventana de video on pyqt, que la de opencv interfiere self.videoWidget = VideoWidget(); self.videoWidget.setWindowTitle(self.titulo); self.videoWidget.show(); print "Empezando a leer frames de la cola..." threadPlayFrames = threading.Thread(target=self.playFrames); threadPlayFrames.start(); #función que es llamada remotamente y añade frames de un cliente a la cola def sendFrames(self,frameBin): if(len(self.frames) < 200): self.frames.append(self.toArray(frameBin.data)); else: print "Buffer lleno" #funcion que graba frames de la cámara y los añade a esta cola y también los manda a otro cliente def grabar(self): cap = cv2.VideoCapture(0); proxy = xmlrpclib.ServerProxy("http://" + str(self.ipRemoto) + ":" + str(self.puertoRemoto) + "/",allow_none=True) while(self.grabando): print "Grabando frames..." ret,frame = cap.read(); frameBin = xmlrpclib.Binary(self.toString(frame)); proxy.sendFrames(frameBin); self.sendFrames(frameBin); cap.release(); #función para iniciar una videollamada con un cliente remoto def iniciarVideoLlamada(self): self.startPlayFrames(); proxy = xmlrpclib.ServerProxy("http://" + str(self.ipRemoto) + ":" + str(self.puertoRemoto) + "/",allow_none=True) proxy.startPlayFrames(); if(self.grabando): print "Iniciando videoLlamada.." threadVideoLlamada = threading.Thread(target=self.grabar); threadVideoLlamada.start();