gmyth-stream/server/0.3/plugins/transcoders/gmencoder.py
author morphbr
Wed Jul 04 08:33:19 2007 +0100 (2007-07-04)
branchtrunk
changeset 773 361cb0686ff7
parent 748 bf9dac4bdc5d
child 775 7cd98c74da22
permissions -rw-r--r--
[svn r779] - Added serve_file_info method
     1 #!/usr/bin/env python
     2 
     3 __author__ = "Renato Filho"
     4 __author_email__ = "renato.filho@indt.org.br"
     5 __license__ = "GPL"
     6 __version__ = "0.2"
     7 
     8 import os
     9 import sys
    10 import shlex
    11 import signal
    12 import subprocess
    13 import time
    14 
    15 import select
    16 
    17 import lib.utils as utils
    18 import lib.server as server
    19 import lib.transcoder as transcoder
    20 
    21 __all__ = ("TranscoderGMencoder",)
    22 
    23 class TranscoderGMencoder(transcoder.Transcoder):
    24     gmencoder_path = utils.which("gmencoder")
    25     name = "gmencoder"
    26     priority = -1
    27     proc = None
    28 
    29     def __init__(self, params):
    30         transcoder.Transcoder.__init__(self, params)
    31         self.opts = []
    32     # __init__()
    33 
    34     def _insert_param (self, name, value):
    35         if (value != ""):
    36             self.opts.append(name)
    37             self.opts.append(value)
    38 
    39     def _parser_params (self):
    40         self._insert_param("-i", \
    41             "%s://%s" % (self.params_first("type", "file"),
    42                          self.params_first("uri", "")))
    43         self._insert_param("--video-encode", self.params_first("ve", ""))
    44         self._insert_param("--video-opts", "bitrate=200,pass=2,quantizer=5")
    45         self._insert_param("--video-fps", self.params_first("fps", ""))
    46         self._insert_param("--video-width", self.params_first("width", "320"))
    47         self._insert_param("--video-height", self.params_first("height", "240"))
    48         self._insert_param("--audio-rate", "32000")
    49         self._insert_param("--audio-encode", self.params_first("ae", ""))
    50     # _parse_params
    51 
    52     def start(self, outfd):
    53         self.opts.append (self.gmencoder_path)
    54         self._parser_params ()
    55 
    56         outfile = self.params_first("outfile", "")
    57 
    58         if outfile != "":
    59             path = os.path.join(sys.path[0], ".transcoded", outfile)
    60             self._insert_param("-o", "file://%s" % path)
    61         else:
    62             self._insert_param ("-o", "fd://%d" % outfd.fileno())
    63             self.opts.append ("-c") 
    64 
    65         cmd = " ".join(self.opts)
    66         self.log.info(self.tid, "GMencoder: %s" % cmd)
    67 
    68         try:
    69             self.proc = subprocess.Popen(self.opts, stdin=subprocess.PIPE,
    70                                          stdout=subprocess.PIPE)
    71         except Exception, e:
    72             self.log.error(self.tid, "Error: executing GMencoder: %s" % e)
    73             outfd.write("Error: GMencoder: %s" % e)
    74             return False
    75 
    76         if outfile:
    77             outfd.write("OK   ")
    78 
    79         try:
    80             while (self.proc and self.proc.poll() == None):
    81                 r, w, x = select.select([self.proc.stdout], [], [], 0)
    82                 if self.proc.stdout in r:
    83                     progress = self.proc.stdout.readline()
    84                     self.log.debug(self.tid, "stdout %s" % progress)
    85                     if (progress.find ("PROGRESS") >= 0):
    86                         self.status = progress.split (":")[1]
    87         except Exception, e:
    88             self.log.error(self.tid, "Problems handling data: %s" % e)
    89             return False
    90 
    91         self.log.info(self.tid, "OK: Done")
    92         return True
    93     # start()
    94 
    95 
    96     def stop(self):
    97         if self.proc:
    98             self.log.info(self.tid, "Stopped GMencoder plugin")
    99             try:
   100                 self.proc.stdin.write("QUIT\n")
   101                 os.kill(self.proc.pid, signal.SIGKILL)
   102                 self.proc.wait()
   103             except Exception, e:
   104                 pass
   105 
   106             self.proc = None
   107     # stop()
   108 
   109 # TranscoderGMencoder