通过子进程终止命令执行

时间:2014-02-24 09:15:54

标签: python ffmpeg streaming subprocess

我有一个python脚本,它监听特定的流并将其记录为:

subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'])

它还检查端口7777上的tcp连接(当流是活动时它连接到我的电脑上的这个端口)我想在每次端口7777上的连接关闭时终止子进程命令。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

subprocess.call()是一个阻塞调用 - 它等待子进程完成。

您可能希望使用subprocess.Popen(),它会返回您可以与Popen.terminate()交互的Popen object,并使用{{1}}终止。

请参阅documentation here

答案 1 :(得分:1)

from subprocess import Popen, STDOUT, PIPE
from time import sleep

def connected(sock):
    try:
        sock.send(b'')
    except:
        return False
    return True

handle = Popen(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'], shell=False, stdout=PIPE, stdin=PIPE, stderr=STDOUT)

output = ''
while handle.poll() is None and connected(socket): # No exit code given, ergo command still running
    output += handle.stdout.readline()
    sleep(0.025)

if not connected(socket):
    handle.terminate()

output += handle.stdout.read()
handle.stdout.close()
handle.stdin.close()
print(output)

注意:我不知道“套接字”是什么,但我假设只是一个常规的套接字。
我想指出,我绝不是一个完美的程序员,但是这会让你知道你需要做什么,而不是完美的,这会起作用:)