我正在处理一个相当奇怪的问题。
我为一年前版本的ffmpeg编写了一个Python包装器(在Python 2.6.6中)。问题是,给定一个非常特殊的视频,ffmpeg
停止正常工作(笨重的输出,完整的CPU使用,没有结束阶段等),并使用它解决python解释器。
现在,如果我直接从终端运行我的编码选项ffmpeg
并将有问题的视频作为输入,ffmpeg
将不会立即回复Ctrl-c
。我必须在退出之前等待10秒或更长时间,并给我回复提示。但是,如果我使用“健康”视频,它只会打印Received signal 2: terminating.
并优雅地退出。
在python包装器中,我使用p.kill()
无效。行为完全相同a.k.a我必须在程序退出前等待10秒。如果冻结某些有问题的视频,我怎能立即停止ffmpeg
?
请注意,如果我执行双Ctrl-c
,无论如何都会立即收到提示。
答案 0 :(得分:3)
你是如何执行FFmpeg子进程的?有很多方法可以在Python中启动和监控进程。
我曾经处理过这个问题,因为我曾经为FFmpeg项目运行连续自动化测试。当我需要调试它时,我会打印出我的程序认为对应于正在运行的FFmpeg进程的PID。然后我会使用top
或ps
来验证PID是否正确。 Linux和Mac OS X之间存在一些奇怪之处,涉及传递给Python函数的shell参数以及PID是与FFmpeg进程相关还是与启动FFmpeg进程的shell相关。
另请参阅:this old blog post I wrote exploring the problem, and the numerous responses。
答案 1 :(得分:1)
如果你使用的是linux,你可以通过以下方式将它留给shell:
subprocess.call( "kill -9 $(pidof ffmpeg)", shell=True )