我试图在我的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]
答案 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