gmyth-stream/server/plugins/media/ffmpeg.py
author renatofilho
Tue Apr 03 16:42:04 2007 +0100 (2007-04-03)
branchtrunk
changeset 484 27e83a8f68d7
permissions -rw-r--r--
[svn r489] moved server implementation to new dir
renatofilho@484
     1
import os
renatofilho@484
     2
import sys
renatofilho@484
     3
import lib
renatofilho@484
     4
import time
renatofilho@484
     5
import socket
renatofilho@484
     6
import ConfigParser
renatofilho@484
     7
renatofilho@484
     8
class Media:
renatofilho@484
     9
renatofilho@484
    10
    def __init__(self, config):
renatofilho@484
    11
renatofilho@484
    12
        self.config = config
renatofilho@484
    13
        self.socket = None
renatofilho@484
    14
        self.child_pid = None
renatofilho@484
    15
renatofilho@484
    16
    def setup(self, filename, mux, vcodec, vbitrate,\
renatofilho@484
    17
              fps, acodec, abitrate, width, height, port):
renatofilho@484
    18
renatofilho@484
    19
        self.filename = filename
renatofilho@484
    20
        self.mux = mux
renatofilho@484
    21
        self.vcodec = vcodec
renatofilho@484
    22
        self.vbitrate = int(vbitrate)
renatofilho@484
    23
        self.fps = int(fps)
renatofilho@484
    24
        self.acodec = acodec
renatofilho@484
    25
        self.abitrate = int(abitrate)
renatofilho@484
    26
        self.width = int(width)
renatofilho@484
    27
        self.height = int(height)
renatofilho@484
    28
renatofilho@484
    29
        self.port = int(port)
renatofilho@484
    30
renatofilho@484
    31
        # good one: /tmp/mpg/cpm.mpg mpeg mpeg1video 400 25 mp2 192 320 240 5000
renatofilho@484
    32
        self.path = self.config.get("FFmpeg", "path")
renatofilho@484
    33
        self.path += " -i %s -f %s -vcodec %s -b %d -r %d -acodec %s -ab %d -s %dx%d -" % (
renatofilho@484
    34
            self.filename, self.mux, self.vcodec, self.vbitrate,\
renatofilho@484
    35
            self.fps, self.acodec, self.abitrate, self.width, self.height)
renatofilho@484
    36
renatofilho@484
    37
        if (self.socket != None):
renatofilho@484
    38
            del(self.socket)
renatofilho@484
    39
renatofilho@484
    40
        self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
renatofilho@484
    41
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
renatofilho@484
    42
        self.socket.bind( ('', self.port) )
renatofilho@484
    43
        self.socket.settimeout(10)
renatofilho@484
    44
        self.socket.listen(1)
renatofilho@484
    45
renatofilho@484
    46
    def play(self):
renatofilho@484
    47
renatofilho@484
    48
        lib.log("Starting FFmpeg: %s" % self.path)
renatofilho@484
    49
renatofilho@484
    50
        # exec FFmpeg and get stdout
renatofilho@484
    51
        child_stdin, child_stdout = os.popen2(self.path)
renatofilho@484
    52
        child_stdin.close()
renatofilho@484
    53
renatofilho@484
    54
        self.child_pid = os.fork()
renatofilho@484
    55
        if (self.child_pid == 0):
renatofilho@484
    56
            #child
renatofilho@484
    57
renatofilho@484
    58
            conn,addr= self.socket.accept()
renatofilho@484
    59
            lib.log("Sending Data to client: %s" % addr[0])
renatofilho@484
    60
            data = child_stdout.read(1024)
renatofilho@484
    61
            conn.settimeout(5)
renatofilho@484
    62
            retry = 0
renatofilho@484
    63
renatofilho@484
    64
            while( data != "" and retry < 5):
renatofilho@484
    65
                try:
renatofilho@484
    66
                    conn.send(data)
renatofilho@484
    67
                except socket.error:
renatofilho@484
    68
                    lib.log("Socket error (maybe timeout ?)")
renatofilho@484
    69
                    retry = retry + 1
renatofilho@484
    70
renatofilho@484
    71
                data = child_stdout.read(1024)
renatofilho@484
    72
renatofilho@484
    73
            if (retry < 5):
renatofilho@484
    74
                lib.log("Finished sending Data to client: %s" % addr[0])
renatofilho@484
    75
            else:
renatofilho@484
    76
                lib.log("Client timed out")
renatofilho@484
    77
renatofilho@484
    78
            child_stdout.close()
renatofilho@484
    79
            #conn.close()
renatofilho@484
    80
            #sys.exit()
renatofilho@484
    81
renatofilho@484
    82
renatofilho@484
    83
    def stop(self):
renatofilho@484
    84
renatofilho@484
    85
        if (self.socket != None):
renatofilho@484
    86
            lib.log("Closing socket")
renatofilho@484
    87
            self.socket.close()
renatofilho@484
    88
renatofilho@484
    89
        lib.log("Trying to stop FFmpeg process")
renatofilho@484
    90
        if (self.child_pid != None):
renatofilho@484
    91
            os.kill(self.child_pid, 9)