1

我正在尝试将一堆视频转换为在我的 iPad 上播放。我正在使用 subprocess 模块,据我了解,它在与我的脚本不同的进程中启动二进制文件。我不确定如何处理要求第一个进程在第二个进程开始之前终止的 2-pass 编码。

这是我的代码:

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() 函数,两个进程都会立即生成。

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

我怎样才能解决这个问题?或者,还有更好的方法?

4

3 回答 3

6

只需将 p.wait() 添加到您的 supprocess 中,直到您的第一次通过完成后它才会继续。

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

出于可读性的目的,像在终端中那样编写命令可能更容易,然后只需使用 split() 将其放入字符串数组中。例子:

p = subprocess.Popen(
   'ffmpeg -i blah.mov -s 128x72 blah.jpg'.split())
p.wait()
于 2012-08-31T22:59:53.300 回答
0

(没有找到“评论”链接,如“回答”:)

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

于 2012-08-31T21:02:00.963 回答
0

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

于 2012-11-22T22:30:39.263 回答