diff --git a/Client.py b/Client.py index 94942f7..4d54425 100644 --- a/Client.py +++ b/Client.py @@ -1,6 +1,6 @@ __author__ = 'Tibbers' -from Tkinter import * -import tkMessageBox +from tkinter import * +import tkinter.messagebox as tkMessageBox from PIL import Image, ImageTk import socket, threading, sys, traceback, os @@ -80,7 +80,7 @@ def exitClient(self): self.master.destroy() # Close the gui window os.remove(CACHE_FILE_NAME + str(self.sessionId) + CACHE_FILE_EXT) # Delete the cache image from video rate = float(self.counter/self.frameNbr) - print '-'*60 + "\nRTP Packet Loss Rate :" + str(rate) +"\n" + '-'*60 + print ('-'*60 + "\nRTP Packet Loss Rate :" + str(rate) +"\n" + '-'*60) sys.exit(0) def pauseMovie(self): @@ -92,7 +92,7 @@ def playMovie(self): """Play button handler.""" if self.state == self.READY: # Create a new thread to listen for RTP packets - print "Playing Movie" + print ("Playing Movie") threading.Thread(target=self.listenRtp).start() self.playEvent = threading.Event() self.playEvent.clear() @@ -106,19 +106,19 @@ def listenRtp(self): if data: rtpPacket = RtpPacket() rtpPacket.decode(data) - print "||Received Rtp Packet #" + str(rtpPacket.seqNum()) + "|| " + print ("||Received Rtp Packet #" + str(rtpPacket.seqNum()) + "|| ") try: if self.frameNbr + 1 != rtpPacket.seqNum(): self.counter += 1 - print '!'*60 + "\nPACKET LOSS\n" + '!'*60 + print ('!'*60 + "\nPACKET LOSS\n" + '!'*60) currFrameNbr = rtpPacket.seqNum() #version = rtpPacket.version() except: - print "seqNum() error" - print '-'*60 + print ("seqNum() error") + print ('-'*60) traceback.print_exc(file=sys.stdout) - print '-'*60 + print ('-'*60) if currFrameNbr > self.frameNbr: # Discard the late packet self.frameNbr = currFrameNbr @@ -126,7 +126,7 @@ def listenRtp(self): except: # Stop listening upon requesting PAUSE or TEARDOWN - print "Didn`t receive data!" + print ("Didn`t receive data!") if self.playEvent.isSet(): break @@ -145,12 +145,12 @@ def writeFrame(self, data): try: file = open(cachename, "wb") except: - print "file open error" + print ("file open error") try: file.write(data) except: - print "file write error" + print ("file write error") file.close() @@ -161,10 +161,10 @@ def updateMovie(self, imageFile): try: photo = ImageTk.PhotoImage(Image.open(imageFile)) #stuck here !!!!!! except: - print "photo error" - print '-'*60 + print ("photo error") + print ('-'*60) traceback.print_exc(file=sys.stdout) - print '-'*60 + print ('-'*60) self.label.configure(image = photo, height=288) self.label.image = photo @@ -194,7 +194,7 @@ def sendRtspRequest(self, requestCode): # request = ... request = "SETUP " + str(self.fileName) + "\n" + str(self.rtspSeq) + "\n" + " RTSP/1.0 RTP/UDP " + str(self.rtpPort) - self.rtspSocket.send(request) + self.rtspSocket.send(request.encode('utf-8')) # Keep track of the sent request. # self.requestSent = ... self.requestSent = self.SETUP @@ -208,8 +208,8 @@ def sendRtspRequest(self, requestCode): # request = ... request = "PLAY " + "\n" + str(self.rtspSeq) - self.rtspSocket.send(request) - print '-'*60 + "\nPLAY request sent to Server...\n" + '-'*60 + self.rtspSocket.send(request.encode('utf-8')) + print ('-'*60 + "\nPLAY request sent to Server...\n" + '-'*60) # Keep track of the sent request. # self.requestSent = ... self.requestSent = self.PLAY @@ -222,8 +222,8 @@ def sendRtspRequest(self, requestCode): # Write the RTSP request to be sent. # request = ... request = "PAUSE " + "\n" + str(self.rtspSeq) - self.rtspSocket.send(request) - print '-'*60 + "\nPAUSE request sent to Server...\n" + '-'*60 + self.rtspSocket.send(request.encode('utf-8')) + print ('-'*60 + "\nPAUSE request sent to Server...\n" + '-'*60) # Keep track of the sent request. # self.requestSent = ... self.requestSent = self.PAUSE @@ -239,8 +239,8 @@ def sendRtspRequest(self, requestCode): # Write the RTSP request to be sent. # request = ... request = "TEARDOWN " + "\n" + str(self.rtspSeq) - self.rtspSocket.send(request) - print '-'*60 + "\nTEARDOWN request sent to Server...\n" + '-'*60 + self.rtspSocket.send(request.encode('utf-8')) + print ('-'*60 + "\nTEARDOWN request sent to Server...\n" + '-'*60) # Keep track of the sent request. # self.requestSent = ... self.requestSent = self.TEARDOWN @@ -268,10 +268,10 @@ def recvRtspReply(self): break def parseRtspReply(self, data): - print "Parsing Received Rtsp data..." + print ("Parsing Received Rtsp data...") """Parse the RTSP reply from the server.""" - lines = data.split('\n') + lines = data.decode('utf-8').split('\n') seqNum = int(lines[1].split(' ')[1]) # Process only if the server reply's sequence number is the same as the request's @@ -289,17 +289,17 @@ def parseRtspReply(self, data): # TO COMPLETE #------------- # Update RTSP state. - print "Updating RTSP state..." + print ("Updating RTSP state...") # self.state = ... self.state = self.READY # Open RTP port. #self.openRtpPort() - print "Setting Up RtpPort for Video Stream" + print ("Setting Up RtpPort for Video Stream") self.openRtpPort() elif self.requestSent == self.PLAY: self.state = self.PLAYING - print '-'*60 + "\nClient is PLAYING...\n" + '-'*60 + print ('-'*60 + "\nClient is PLAYING...\n" + '-'*60) elif self.requestSent == self.PAUSE: self.state = self.READY @@ -334,7 +334,7 @@ def openRtpPort(self): #self.rtpSocket.connect(self.serverAddr,self.rtpPort) self.rtpSocket.bind((self.serverAddr,self.rtpPort)) # WATCH OUT THE ADDRESS FORMAT!!!!! rtpPort# should be bigger than 1024 #self.rtpSocket.listen(5) - print "Bind RtpPort Success" + print ("Bind RtpPort Success") except: tkMessageBox.showwarning('Connection Failed', 'Connection to rtpServer failed...') @@ -347,7 +347,7 @@ def handler(self): self.exitClient() else: # When the user presses cancel, resume playing. #self.playMovie() - print "Playing Movie" + print ("Playing Movie") threading.Thread(target=self.listenRtp).start() #self.playEvent = threading.Event() #self.playEvent.clear() diff --git a/ClientLauncher.py b/ClientLauncher.py index e939d56..4ccdca0 100644 --- a/ClientLauncher.py +++ b/ClientLauncher.py @@ -1,6 +1,6 @@ __author__ = 'Tibbers' import sys -from Tkinter import Tk +from tkinter import Tk from Client import Client if __name__ == "__main__": @@ -10,7 +10,7 @@ rtpPort = sys.argv[3] fileName = sys.argv[4] except: - print "[Usage: ClientLauncher.py Server_name Server_port RTP_port Video_file]\n" + print ("[Usage: ClientLauncher.py Server_name Server_port RTP_port Video_file]\n") root = Tk() diff --git a/README.md b/README.md index ff924eb..a9f1864 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ How to: Example: Open a terminal: - python Server.py 1025 + python3 Server.py 1025 Open another terminal: - python ClientLauncher.py 127.0.0.1 1025 5008 video.mjpeg + python3 ClientLauncher.py 127.0.0.1 1025 5008 video.mjpeg @@ -15,7 +15,7 @@ Example: Start the server with the command line - python Server.py server_port + python3 Server.py server_port Where server_port is the port your server listens to for incoming RTSP connections # 1025 @@ -26,7 +26,7 @@ Open a new terminal Start the client with the command line - python ClientLauncher.py server_host server_port RTP_port video_file + python3 ClientLauncher.py server_host server_port RTP_port video_file Where # server_host : the name of the machine where server is running (here "127.0.0.1") diff --git a/RtpPacket.py b/RtpPacket.py index e57eb63..cfe5917 100644 --- a/RtpPacket.py +++ b/RtpPacket.py @@ -18,7 +18,7 @@ def encode(self, version, padding, extension, cc, seqnum, marker, pt, ssrc, payl """Encode the RTP packet with header fields and payload.""" timestamp = int(time()) - print "timestamp: " + str(timestamp) + print ("timestamp: " + str(timestamp)) self.header = bytearray(HEADER_SIZE) #-------------- # TO COMPLETE @@ -45,8 +45,8 @@ def encode(self, version, padding, extension, cc, seqnum, marker, pt, ssrc, payl self.header[1] = marker << 7 self.header[1] = self.header[1] | pt - self.header[2] = seqnum >> 8 - self.header[3] = seqnum + self.header[2] = seqnum >> 8 & 0xFF # sequence number: 16 bits + self.header[3] = seqnum & 0xFF self.header[4] = (timestamp >> 24) & 0xFF self.header[5] = (timestamp >> 16) & 0xFF @@ -98,4 +98,4 @@ def getPayload(self): def getPacket(self): """Return RTP packet.""" - return self.header + self.payload \ No newline at end of file + return self.header + self.payload diff --git a/Server.py b/Server.py index 0baf317..a8b0768 100644 --- a/Server.py +++ b/Server.py @@ -9,10 +9,10 @@ def main(self): try: SERVER_PORT = int(sys.argv[1]) except: - print "[Usage: Server.py Server_port]\n" + print("[Usage: Server.py Server_port]\n") rtspSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) rtspSocket.bind(('', SERVER_PORT)) - print "RTSP Listing incoming request..." + print("RTSP Listing incoming request...") rtspSocket.listen(5) # Receive client info (address,port) through RTSP/TCP session diff --git a/ServerWorker.py b/ServerWorker.py index c50394b..6a549aa 100644 --- a/ServerWorker.py +++ b/ServerWorker.py @@ -37,13 +37,11 @@ def recvRtspRequest(self): while True: data = connSocket.recv(256) ### if data: - print '-'*60 + "\nData received:\n" + '-'*60 + print ('-'*60 + "\nData received:\n" + '-'*60) self.processRtspRequest(data) def processRtspRequest(self, data): - """Process RTSP request sent from the client.""" - # Get the request type - request = data.split('\n') + request = data.decode('utf-8').split('\n') line1 = request[0].split(' ') requestType = line1[0] # Get the media file name @@ -55,7 +53,7 @@ def processRtspRequest(self, data): if requestType == self.SETUP: if self.state == self.INIT: # Update state - print "SETUP Request received\n" + print ("SETUP Request received\n") try: @@ -70,23 +68,23 @@ def processRtspRequest(self, data): # Send RTSP reply self.replyRtsp(self.OK_200, seq[0]) #seq[0] the sequenceNum received from Client.py - print "sequenceNum is " + seq[0] + print ("sequenceNum is " + seq[0]) # Get the RTP/UDP port from the last line self.clientInfo['rtpPort'] = request[2].split(' ')[3] - print '-'*60 + "\nrtpPort is :" + self.clientInfo['rtpPort'] + "\n" + '-'*60 - print "filename is " + filename + print ('-'*60 + "\nrtpPort is :" + self.clientInfo['rtpPort'] + "\n" + '-'*60) + print ("filename is " + filename) # Process PLAY request elif requestType == self.PLAY: if self.state == self.READY: - print '-'*60 + "\nPLAY Request Received\n" + '-'*60 + print ('-'*60 + "\nPLAY Request Received\n" + '-'*60) self.state = self.PLAYING # Create a new socket for RTP/UDP self.clientInfo["rtpSocket"] = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.replyRtsp(self.OK_200, seq[0]) - print '-'*60 + "\nSequence Number ("+ seq[0] + ")\nReplied to client\n" + '-'*60 + print ('-'*60 + "\nSequence Number ("+ seq[0] + ")\nReplied to client\n" + '-'*60) # Create a new thread and start sending RTP packets self.clientInfo['event'] = threading.Event() @@ -94,13 +92,13 @@ def processRtspRequest(self, data): self.clientInfo['worker'].start() # Process RESUME request elif self.state == self.PAUSE: - print '-'*60 + "\nRESUME Request Received\n" + '-'*60 + print('-'*60 + "\nRESUME Request Received\n" + '-'*60) self.state = self.PLAYING # Process PAUSE request elif requestType == self.PAUSE: if self.state == self.PLAYING: - print '-'*60 + "\nPAUSE Request Received\n" + '-'*60 + print('-'*60 + "\nPAUSE Request Received\n" + '-'*60) self.state = self.READY self.clientInfo['event'].set() @@ -109,7 +107,7 @@ def processRtspRequest(self, data): # Process TEARDOWN request elif requestType == self.TEARDOWN: - print '-'*60 + "\nTEARDOWN Request Received\n" + '-'*60 + print ('-'*60 + "\nTEARDOWN Request Received\n" + '-'*60) self.clientInfo['event'].set() @@ -155,10 +153,10 @@ def sendRtp(self): counter += 1 time.sleep(jit) except: - print "Connection Error" - print '-'*60 + print ("Connection Error") + print ('-'*60) traceback.print_exc(file=sys.stdout) - print '-'*60 + print ('-'*60) def makeRtp(self, payload, frameNbr): """RTP-packetize the video data.""" @@ -183,10 +181,10 @@ def replyRtsp(self, code, seq): #print "200 OK" reply = 'RTSP/1.0 200 OK\nCSeq: ' + seq + '\nSession: ' + str(self.clientInfo['session']) connSocket = self.clientInfo['rtspSocket'][0] - connSocket.send(reply) + connSocket.send(reply.encode('utf-8')) # Error messages elif code == self.FILE_NOT_FOUND_404: - print "404 NOT FOUND" + print ("404 NOT FOUND") elif code == self.CON_ERR_500: - print "500 CONNECTION ERROR" + print ("500 CONNECTION ERROR") diff --git a/VideoStream.py b/VideoStream.py index f9d81f4..c6151b6 100644 --- a/VideoStream.py +++ b/VideoStream.py @@ -5,9 +5,9 @@ def __init__(self, filename): self.filename = filename try: self.file = open(filename, 'rb') - print '-'*60 + "\nVideo file : |" + filename + "| read\n" + '-'*60 + print ('-'*60 + "\nVideo file : |" + filename + "| read\n" + '-'*60) except: - print "read " + filename + " error" + print ("read " + filename + " error") raise IOError self.frameNum = 0 @@ -15,14 +15,12 @@ def nextFrame(self): """Get next frame.""" data = self.file.read(5) # Get the framelength from the first 5 bytes - #data_ints = struct.unpack('<' + 'B'*len(data),data) - data = bytearray(data) - - data_int = (data[0] - 48) * 10000 + (data[1] - 48) * 1000 + (data[2] - 48) * 100 + (data[3] - 48) * 10 + (data[4] - 48)# = #int(data.encode('hex'),16) - - final_data_int = data_int if data: + #data_ints = struct.unpack('<' + 'B'*len(data),data) + data = bytearray(data) + data_int = (data[0] - 48) * 10000 + (data[1] - 48) * 1000 + (data[2] - 48) * 100 + (data[3] - 48) * 10 + (data[4] - 48)# = #int(data.encode('hex'),16) + final_data_int = data_int framelength = final_data_int#int(data)#final_data_int/8 # xx bytes # Read the current frame @@ -35,7 +33,7 @@ def nextFrame(self): # raise ValueError('invalid jpeg') self.frameNum += 1 - print '-'*10 + "\nNext Frame (#" + str(self.frameNum) + ") length:" + str(framelength) + "\n" + '-'*10 + print ('-'*10 + "\nNext Frame (#" + str(self.frameNum) + ") length:" + str(framelength) + "\n" + '-'*10) return frame