gmyth-stream/server/0.3/plugins/transcoders/gmencoder.py
author morphbr
Mon Jul 02 08:33:58 2007 +0100 (2007-07-02)
branchtrunk
changeset 766 f1da4fbe667e
parent 735 15a191556cd6
child 768 b405295259f3
permissions -rw-r--r--
[svn r772] * Corrected identation;
* Corrected connect with timeout while retrieving channel_list
     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 
    64         cmd = " ".join(self.opts)
    65         self.log.info(self.tid, "GMencoder: %s" % cmd)
    66 
    67         try:
    68             self.proc = subprocess.Popen(self.opts, stdin=subprocess.PIPE,
    69                                          stdout=subprocess.PIPE)
    70         except Exception, e:
    71             self.log.error(self.tid, "Error: executing GMencoder: %s" % e)
    72             outfd.write("Error: GMencoder: %s" % e)
    73             return False
    74 
    75         if outfile:
    76             outfd.write("OK   ")
    77 
    78         try:
    79             while (self.proc and self.proc.poll() == None):
    80                 r, w, x = select.select([self.proc.stdout], [], [], 0)
    81                 if self.proc.stdout in r:
    82                     progress = self.proc.stdout.readline()
    83                     self.log.debug(self.tid, "stdout %s" % progress)
    84                     if (progress.find ("PROGRESS") >= 0):
    85                         self.status = progress.split (":")[1]
    86         except Exception, e:
    87             self.log.error(self.tid, "Problems handling data: %s" % e)
    88             return False
    89 
    90         self.log.info(self.tid, "OK: Done")
    91         return True
    92     # start()
    93 
    94 
    95     def stop(self):
    96         if self.proc:
    97             self.log.info(self.tid, "Stopped GMencoder plugin")
    98             try:
    99                 self.proc.stdin.write("QUIT\n")
   100                 os.kill(self.proc.pid, signal.SIGKILL)
   101                 self.proc.wait()
   102             except Exception, e:
   103                 pass
   104 
   105             self.proc = None
   106     # stop()
   107 
   108 # TranscoderGMencoder