【发布时间】:2012-08-26 13:44:42
【问题描述】:
我正在尝试转换一堆视频以在我的 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() 函数后,两个进程都会立即生成。
第二个过程失败,因为第一个过程尚未完成。
我该如何解决这个问题?或者,有没有更好的方法?
【问题讨论】:
-
ffmpg 不能在 stdios 上运行?不能将第一个进程的标准输出连接到第二个进程的标准输入吗?
-
这很奇怪。当我从 shell 运行它时,我看到它们几乎同时执行。第二个失败,但第一个通过。 ffmpeg 不会使用这些标志进入背景。
-
@tmc 我在这样做时遇到了麻烦,因为元数据并不总是在文件的开头。输出到标准输出很好,但输入给了我问题,除非元数据在开头。
-
如果第一个通过,并且不在后台,那么它们如何同时进行?
-
如果你真的不能从下一个管道传输,我想我只会对目录中的文件进行第一次传递而不是第二次传递;而不是尝试一次对每个文件进行两次传递。
标签: python ffmpeg subprocess