簡體   English   中英

子進程調用 ffmpeg(命令行)

[英]subprocess call ffmpeg (command line)

我一直在我的程序中加入子進程調用。 我對其他命令的子進程調用沒有任何問題,但在獲取命令行輸入時遇到問題

ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg

在 subprocess.call() 中工作

我嘗試了以下但沒有成功:

subprocess.call('ffmpeg -r 10 -i %s frame%03.d.png - r ntsc movie.mpg')

有什么想法嗎? 我是否將不同的命令分開,我是否使用%s%d指定字符串、整數等?

當您使用 subprocess 時,您的命令必須是一個與您在命令行上鍵入的內容完全相同的字符串(並且您設置了 shell=True),或者是一個列表,其中每個命令都是列表中的一個項目(並且您將默認外殼=假)。 無論哪種情況,您都必須處理字符串的可變部分。 例如,操作系統不知道“%03d”是什么,你必須填寫它。

我無法從你的問題中確切地說出參數是什么,但假設你想轉換第 3 幀,它在字符串中看起來像這樣:

my_frame = 3
subprocess.call(
    'ffmpeg -r 10 -i frame%03d.png -r ntsc movie%03d.mpg' % (my_frame, my_frame),
    shell=True)

在這個例子中它有點微妙,但這是有風險的。 假設這些東西在一個名字有空格的目錄中(例如,./My Movies/Scary Movie)。 外殼會被這些空間混淆。

所以,你可以把它放在一個列表中,避免這個問題

my_frame = 3
subprocess.call([
    'ffmpeg',
    '-r', '10',
    '-i', 'frame%03d.png' % my_frame,
    '-r', 'ntsc',
    'movie%03d.mpg' % my_frame,
])

更多打字,但更安全。

我發現這個替代的,簡單的,答案也有效。

subprocess.call('ffmpeg -r 10 -i frame%03d.png -r ntsc '+str(out_movie), shell=True)
import shlex
import pipes
from subprocess import check_call

command = 'ffmpeg -r 10 -i frame%03d.png -r ntsc ' + pipes.quote(out_movie)
check_call(shlex.split(command))

'ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg'應該沒問題。 OTOH,如果您不需要frame%03d.pngframe*.png會更簡單一些。

如果你想“如果我用變量名替換 'movie.mpg' 來查看它的語法”,它看起來像這樣:

cmd = 'ffmpeg -r 10 -i "frame%%03d.png" -r ntsc "%s"' % moviename

我們需要逃脫%有額外% ,從Python的%替代機械隱藏它。 我還添加了雙引號" ,以應對 tdelaney 提到的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM