2014-09-24 295 views
0

我試圖在我的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] 

回答

0

的問題與您的代碼是,直至到達檔案結尾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.塞巴斯蒂安的評論。

+1

你不需要'multiprocessing.Process'獲得子輸出而不堵,你可以[使用線程或async.io代替] (http://stackoverflow.com/a/23616229/4279) – jfs 2014-09-25 10:19:47

+0

'multiprocessing.Process'只是我的第一個想法。但你是對的,謝謝! – 2014-09-25 10:41:08

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