使用Python的子进程模块和ffmpeg运行2遍视频转换

时间:2012-08-31 18:02:34

标签: python ffmpeg subprocess

我正在尝试将一堆视频转换为在我的iPad上播放。我正在使用子进程模块,根据我的理解,在我的脚本的单独进程中启动二进制文件。我不知道如何处理2遍编码,这要求第一个进程在第二个进程之前终止。

这是我的代码:

def convert(filename):
  extension = filename[-3:]

  destination_filename_720 = filename[-4:] + '-a720p' + '.mp4'
  destination_filename_1080 = filename[-4:] + '-a1080p' + '.mp4'

  p = subprocess.Popen(['ffmpeg','-i', str(filename) ,
                        '-acodec' , 'aac' ,
                        '-ab' , '160k' ,
                        '-ac' , '2' ,
                        '-vcodec' , 'libx264' ,
                        '-strict' , '-2' ,
                        '-vpre' , 'ipod640' ,
                        '-threads' , '8' ,
                        '-s' , '1280x720' ,
                        '-b:v' , '2000k' ,
                        '-pass' , '1' ,
                        '-y' ,
                        destination_filename_720])

  p = subprocess.Popen(['ffmpeg','-i', str(filename) ,
                        '-acodec' , 'aac' ,
                        '-ab' , '160k' ,
                        '-ac' , '2' ,
                        '-vcodec' , 'libx264' ,
                        '-strict' , '-2' ,
                        '-vpre' , 'ipod640' ,
                        '-threads' , '8' ,
                        '-s' , '1280x720' ,
                        '-b:v' , '2000k' ,
                        '-pass' , '2' ,
                        '-y' ,
                        destination_filename_720])

一旦调用convert()函数,就会立即生成两个进程。

第二个过程失败,因为第一个过程尚未完成。

我该如何解决这个问题?或者,有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

只需将p.wait()添加到您的支持处理中,直到第一次传递完成后它才会继续。

p = subprocess.Popen(['ffmpeg','-i' ...etc])
p.wait()

出于可读性目的,可以像在终端中一样编写命令,然后使用split()将其带入字符串数组。例如:

p = subprocess.Popen(
   'ffmpeg -i blah.mov -s 128x72 blah.jpg'.split())
p.wait()

答案 1 :(得分:0)

(找不到“评论”链接,以及“回答”:)

最后一行应该有1080而不是720?

答案 2 :(得分:0)

你最好使用pexpect,因为ffmpeg通常不会刷新输出