2013-02-14 61 views
1

我試圖從python運行ffmpeg並獲得一些合理的輸出。無論設置什麼ffmpeg的日誌級別,我從Popen.communicate()獲得的唯一輸出是錯誤的。但內容不是錯誤。我嘗試了相同的代碼來運行其他命令(ls),並且對於out和err輸出,它似乎都正常。運行ffmpeg時Popen.communicate()只返回err

我在這裏檢查過,Google很遺憾地沒有發現任何東西。大多數示例使用os或命令模塊,而不是子進程。

這是我的測試代碼:

command = [ 
     'ffmpeg', 
     '-v', 'debug', 
     '-i', '1.mov', 
     '-vcodec', 'libx264', 
     '-profile:v', 'high', 
     '-preset', 'slower', 
     '-b:v', '1000k', 
     '-vf', 'scale=-1:720', 
     '-threads', '0', 
     '-acodec', 'libfdk_aac', 
     '-b:a', '192k', 
     '-y', 
     '2.mp4', 
     ] 
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate() 
f = open('out.log', 'w') 
f.write(out) 
f.close() 
f = open('error.log', 'w') 
f.write(err) 
f.close() 

你有沒有看到這樣的事情?我是否犯了錯誤或者在ffmpeg中有錯誤?

+0

嘗試在終端運行完全相同的命令參數,看看會發生什麼。要將實際參數作爲字符串獲取,您可以在Python腳本中用'echo'代替'ffmpeg'。 – sashoalm 2013-02-14 20:54:48

+0

在終端中運行命令是可以的。我做我想做的事,控制檯輸出不是錯誤。因此,我期望communican()的返回值相同的輸出。這是錯誤的一部分。我試圖與其他命令一起運行,那裏是可以的。 – 2013-02-16 12:50:19

回答

1

我似乎在ffmpeg的情況下誤解了stdout和stderr。所有的「控制檯輸出」通常指向stderr。將stderr重定向到標準輸出將解決問題。這就是:

p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

對不起,這個...我是過於集中於我完全忽略了很明顯的事情Python的一部分。 :-)

0

默認情況下,ffmpeg記錄到stderr,即您看到預期行爲。

要將命令的stderr輸出保存到一個文件,你不需要.communicate()

import subprocess 

with open("stderr.log", "wb") as logfile: 
    subprocess.check_call(command, stderr=logfile) 
+0

謝謝。我知道check_call。我不保存輸出到文件,但以某種方式處理數據。在這裏放一些簡短的東西,而不是很多其他代碼的垃圾郵件比較容易:-) – 2013-02-16 22:10:09