在Python中使用os.popen3()提取视频缩略图
我正在使用ffmpeg从视频中提取一帧画面。在命令行中使用ffmpeg时,这个操作很顺利,但当我尝试用Python做同样的事情时,就遇到了问题:
os.popen3('ffmpeg -i videoPath -an -ss 00:00:02 -an -r 1 -vframes 1 -y picturePath')
我不知道怎么才能得到提取出来的图片。目前我只看到一些文本,比如(ffmpeg版本 N-62039-gc00f368 版权所有 (c) 2000....),这和我在命令行中看到的一样。请问我该怎么做才能提取出图片呢?谢谢。
2 个回答
0
os这个模块已经不推荐使用了。你应该使用subprocess模块。
1
我通常会使用以下这个函数来处理这类任务。它包含一个超时参数,可以自动中止那些运行时间过长的过程。这在处理用户上传的内容时特别有用:
import subprocess
from threading import Timer
def run_with_timeout(cmd, sec):
def kill_proc(p, killed):
killed['val'] = True
p.kill()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
killed = {'val': False}
timer = Timer(sec, kill_proc, [p, killed])
timer.start()
stdout, stderr = p.communicate()
timer.cancel()
return p.returncode, stdout, stderr, killed['val']
通过这个函数,你可以简单地调用任何带选项的命令,这个命令会同步运行。也就是说,函数会等到这个过程完成后再继续执行。因此,当函数执行完毕时,要么生成了缩略图,要么返回一个错误:
videoPath = '/path/to/video/source/file.mp4'
picturePath = '/path/to/output.jpg'
result = run_with_timeout(['ffmpeg', '-i', videoPath, '-an', '00:00:02', '-r', '1', '-vframes', '1', '-y', picturePath], 30)
if result[0] != 0:
print 'error'
else:
print 'success'
# do something with videoPath
这个方法在当前的Python版本2.7.x中有效。