Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os, subprocess, tempfile, threading, gobject, time, random
- import SocketServer, SimpleHTTPServer
- def which(program):
- def is_exe(fpath):
- return os.path.exists(fpath) and os.access(fpath, os.X_OK)
- fpath, fname = os.path.split(program)
- if fpath:
- if is_exe(program):
- return program
- else:
- for path in os.environ["PATH"].split(os.pathsep):
- exe_file = os.path.join(path, program)
- if is_exe(exe_file):
- return exe_file
- return None
- class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
- def do_GET(self):
- if not os.path.exists(self.server.temp):
- self.send_response(404)
- self.end_headers()
- return
- self.send_response(200)
- self.end_headers()
- fh = open(self.server.temp, 'rb')
- byte = fh.read(1024)
- while byte != "":
- try:
- self.wfile.write(byte)
- except:
- return
- byte = fh.read(1024)
- class Server:
- def __init__(self, temp):
- self.temp = temp
- self.port = random.randint(9000, 9999)
- self.httpd = None
- def start(self, callback):
- self.httpd = SocketServer.ForkingTCPServer(('', self.port), Proxy)
- self.httpd.temp = self.temp
- threading.Thread(target=self.httpd.serve_forever).start()
- gobject.idle_add(callback, 'http://localhost:' + str(self.port))
- def stop(self):
- if self.httpd:
- self.httpd.shutdown()
- print 'Stopped server'
- class Protocol:
- def __init__(self, play_media, stop_media):
- self.play_media = play_media
- self.stop_media = stop_media
- self.stopped = False
- self.params = {}
- self.progress = -1
- self.ffmpeg = None
- self.temp = tempfile.mktemp()
- self.s = None
- if not which('ffmpeg'):
- self.protocols = []
- else:
- self.protocols = ['rtsp://', 'mms://']
- def play(self, url, params = {}):
- self.progress = -1
- self.stopped = False
- os.mkfifo(self.temp)
- if url.startswith('mms://'):
- url = url.replace('mms://', 'mmsh://')
- exe = ['ffmpeg', '-y', '-i', url, '-acodec', 'libmp3lame', '-ar', '44100', '-vcodec', 'mpeg1video', '-f', 'mpeg', '-sameq', self.temp]
- else:
- exe = ['ffmpeg', '-y', '-i', url, '-acodec', 'libmp3lame', '-ar', '44100', '-vcodec', 'copy', '-f', 'flv', self.temp]
- print ' '.join(exe)
- self.ffmpeg = subprocess.Popen(exe, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- self.progress = 0
- threading.Thread(target=self.startmp).start()
- def startmp(self):
- line = self.ffmpeg.stderr.readline()
- while line:
- self.progress = 0
- if 'Stream #0' in line:
- break
- line = self.ffmpeg.stderr.readline()
- self.s = Server(self.temp)
- threading.Thread(target=self.s.start, args=(self.play_url, )).start()
- def play_url(self, url):
- print 'play media', url
- self.play_media(url)
- threading.Thread(target=self.checkrun).start()
- def checkrun(self):
- if not self.ffmpeg:
- return
- while self.ffmpeg.poll() == None:
- if not self.stopped:
- time.sleep(0.1)
- else:
- return
- if not self.ffmpeg:
- return
- print 'RTSP Error'
- gobject.idle_add(self.stop_media, "RTMP Error")
- def stop(self):
- self.stopped = True
- if self.s:
- self.s.stop()
- if self.ffmpeg:
- try:
- os.kill(self.ffmpeg.pid, 9)
- self.ffmpeg = None
- except:
- pass
- if os.path.exists(self.temp):
- os.remove(self.temp)
- self.progress = -1
- def quit(self):
- self.stopped = True
- if self.s:
- self.s.stop()
- if self.ffmpeg:
- try:
- os.kill(self.ffmpeg.pid, 9)
- self.ffmpeg = None
- except:
- pass
- if os.path.exists(self.temp):
- os.remove(self.temp)
- self.progress = -1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement