在python中启动和停止ffmpeg管道

时间:2014-09-24 19:05:44

标签: python ffmpeg

我试图在我的Python脚本中启动和停止ffmpeg管道。我可以使用子进程来启动命令管道,但它会占用脚本,因此它不再接收命令。我需要做些什么才能防止这种情况发生?

我正在使用:

    pipeline= "ffmpeg -f video4linux2 -video_size 640x480 -framerate 15 -input_format yuyv422 -i /dev/video7 -f alsa  -i hw:0,0 -map 0:0 -map 1:0  -b:v 120k -bufsize 120k -vcodec libx264 -preset ultrafast  -acodec aac -strict -2  -f flv -metadata streamName=myStream tcp://192.168.1.20:6666 "

    p = subprocess.Popen(pipeline, shell=True,
                         stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = p.communicate()[0]

2 个答案:

答案 0 :(得分:1)

代码的问题是p.communicate()读取数据直到达到文件结尾。我的想法是使用multiprocessing模块。

示例:

import subprocess
import multiprocessing

def ffmpeg():
    pipeline = 'ffmpeg ...'
    p = subprocess.Popen(pipeline, shell=True, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
    out = p.communicate()[0]

proc = multiprocessing.Process(target=ffmpeg)

这基本上会将您的代码移动到函数ffmpeg中并创建一个新进程来运行它。

您现在可以使用proc.start()开始此过程,并使用proc.terminate()终止该过程。

有关详细信息,请查看multiprocessing的文档。

编辑:

multiprocessing可能有点矫枉过正。见J.F. Sebastian的评论。

答案 1 :(得分:0)

p.communicate()调用在进程退出并读取所有输出之前不会返回。

要避免阻止您的脚本,请放弃p.communicate()电话:

#!/usr/bin/env python3
import shlex
from subprocess import Popen, DEVNULL, STDOUT
# ...
p = Popen(shlex.split(pipeline), stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
# call p.terminate() any time you like, to terminate the ffmpeg process