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();