2017-03-05 100 views
1

這是命令我想使用Python中subprocess.call執行ffmpeg | sed命令的subprocess.call格式?

1. ffmpeg -i filename 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p" 

    filePath = frames/FRAME%05d.png 
2. avconv -r 24 -i filePath -vf 'scale=trunc(iw/2)*2:trunc(ih/2)*2' -s 1920x1080 -c:v libx264 outPath 

我還沒有得到解決,以第二屆一個還沒有,但這裏是我的拉昇第一個

subprocess.call(['ffmpeg', '-i', inputV , '2','>','&1', '|', ' sed', '-n', '"s/.*, \(.*\) fp.*/\1/p"']) 

與此是錯誤

[NULL @ 0x915ce0] Unable to find a suitable output format for '2' 
2: Invalid argument 

我也不能確定文件路徑變量賦值爲價值包括通配符

+1

嘗試用'殼= TRUE; –

+0

錯誤的第一行是不是一個殼或解析錯誤。與ffprobe不同,ffmpeg是一個媒體轉換器。所以它需要一個輸出參數。在'2>&1'之前添加'-f null -' – Mulvya

+0

@Mulvya實際上可以使用上面的這行來從媒體中提取信息,而不用實際轉換任何東西。 –

回答

1

Quickfix:添加shell=True選項,因爲您使用的是shell功能。

Longfix:寫一個適當的subprocess.Popen命令,擺脫sed:做在python直接:

import re 
r = re.compile(".*, (.*) fp.*") 
p=subprocess.Popen(['ffmpeg', '-i', inputV],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 
while True: 
    l = p.readline() 
    if not l: 
     break # end of process 
    s = r.sub(l,r"\1") 
    if l!=s: # substitution worked, print it 
    print(s) 
rc = p.wait() # get return code 

所以你沒有使用shell=True這樣,你蟒蛇內執行sed過濾器:您的代碼不再需要sed

而且stderr=subprocess.STDOUT照顧stderr重定向的stdout