Advertisement
Guest User

RTSP.py

a guest
Mar 12th, 2012
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.59 KB | None | 0 0
  1. import os, subprocess, tempfile, threading, gobject, time, random
  2. import SocketServer, SimpleHTTPServer
  3.  
  4. def which(program):
  5.     def is_exe(fpath):
  6.         return os.path.exists(fpath) and os.access(fpath, os.X_OK)
  7.  
  8.     fpath, fname = os.path.split(program)
  9.     if fpath:
  10.         if is_exe(program):
  11.             return program
  12.     else:
  13.         for path in os.environ["PATH"].split(os.pathsep):
  14.             exe_file = os.path.join(path, program)
  15.             if is_exe(exe_file):
  16.                 return exe_file
  17.  
  18.     return None
  19.  
  20. class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
  21.     def do_GET(self):
  22.         if not os.path.exists(self.server.temp):
  23.             self.send_response(404)
  24.             self.end_headers()
  25.             return
  26.         self.send_response(200)
  27.         self.end_headers()
  28.         fh = open(self.server.temp, 'rb')
  29.         byte = fh.read(1024)
  30.         while byte != "":
  31.             try:
  32.                 self.wfile.write(byte)
  33.             except:
  34.                 return
  35.             byte = fh.read(1024)
  36.  
  37. class Server:
  38.     def __init__(self, temp):
  39.         self.temp = temp
  40.         self.port = random.randint(9000, 9999)
  41.         self.httpd = None
  42.        
  43.     def start(self, callback):
  44.         self.httpd = SocketServer.ForkingTCPServer(('', self.port), Proxy)
  45.         self.httpd.temp = self.temp
  46.         threading.Thread(target=self.httpd.serve_forever).start()
  47.         gobject.idle_add(callback, 'http://localhost:' + str(self.port))
  48.        
  49.     def stop(self):
  50.         if self.httpd:
  51.             self.httpd.shutdown()
  52.             print 'Stopped server'
  53.    
  54. class Protocol:
  55.     def __init__(self, play_media, stop_media):
  56.         self.play_media = play_media
  57.         self.stop_media = stop_media
  58.         self.stopped = False
  59.         self.params = {}
  60.         self.progress = -1
  61.         self.ffmpeg = None
  62.         self.temp = tempfile.mktemp()
  63.         self.s = None
  64.         if not which('ffmpeg'):
  65.             self.protocols = []
  66.         else:
  67.             self.protocols = ['rtsp://', 'mms://']
  68.  
  69.     def play(self, url, params = {}):
  70.         self.progress = -1
  71.         self.stopped = False
  72.         os.mkfifo(self.temp)
  73.         if url.startswith('mms://'):
  74.             url = url.replace('mms://', 'mmsh://')
  75.             exe = ['ffmpeg', '-y', '-i', url, '-acodec', 'libmp3lame', '-ar', '44100', '-vcodec', 'mpeg1video', '-f', 'mpeg', '-sameq', self.temp]
  76.         else:
  77.             exe = ['ffmpeg', '-y', '-i', url, '-acodec', 'libmp3lame', '-ar', '44100', '-vcodec', 'copy', '-f', 'flv', self.temp]
  78.         print ' '.join(exe)
  79.         self.ffmpeg = subprocess.Popen(exe, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  80.         self.progress = 0
  81.         threading.Thread(target=self.startmp).start()
  82.        
  83.     def startmp(self):
  84.         line = self.ffmpeg.stderr.readline()
  85.         while line:
  86.             self.progress = 0
  87.             if 'Stream #0' in line:
  88.                 break
  89.             line = self.ffmpeg.stderr.readline()
  90.         self.s = Server(self.temp)
  91.         threading.Thread(target=self.s.start, args=(self.play_url, )).start()
  92.        
  93.     def play_url(self, url):
  94.         print 'play media', url
  95.         self.play_media(url)
  96.         threading.Thread(target=self.checkrun).start()
  97.        
  98.     def checkrun(self):
  99.         if not self.ffmpeg:
  100.             return
  101.         while self.ffmpeg.poll() == None:
  102.             if not self.stopped:
  103.                 time.sleep(0.1)
  104.             else:
  105.                 return
  106.             if not self.ffmpeg:
  107.                 return
  108.         print 'RTSP Error'
  109.         gobject.idle_add(self.stop_media, "RTMP Error")
  110.            
  111.     def stop(self):
  112.         self.stopped = True
  113.         if self.s:
  114.             self.s.stop()
  115.         if self.ffmpeg:
  116.             try:
  117.                 os.kill(self.ffmpeg.pid, 9)
  118.                 self.ffmpeg = None
  119.             except:
  120.                 pass
  121.         if os.path.exists(self.temp):
  122.             os.remove(self.temp)
  123.         self.progress = -1
  124.        
  125.     def quit(self):
  126.         self.stopped = True
  127.         if self.s:
  128.             self.s.stop()
  129.         if self.ffmpeg:
  130.             try:
  131.                 os.kill(self.ffmpeg.pid, 9)
  132.                 self.ffmpeg = None
  133.             except:
  134.                 pass
  135.         if os.path.exists(self.temp):
  136.             os.remove(self.temp)
  137.         self.progress = -1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement