我在python(using this tutorial)中使用FFMPEG,我的主要目标是截取屏幕截图并将其附加到现有的mp4视频中(使用编码器附加它,而不是原始追加)。
这就是我现在正在使用的代码,这个脚本只会写一帧的视频(第一个截图),并且不会对所有其他截图做任何事情。
command = [ FFMPEG_BIN,
'-f', 'rawvideo',
'-codec', 'rawvideo',
'-s', '1920x1080', # size of one frame
'-pix_fmt', 'rgb24',
'-r', '24', # frames per second
'-i', '-', # The input comes from a pipe
'-an', # Tells FFMPEG not to expect any audio
'-vcodec', 'mpeg4',
'my_output_videofile.mp4' ]
for x in range(30):
pipe = sp.Popen(command, stdin = sp.PIPE, stderr = sp.PIPE)
im = np.array(ImageGrab.grab()).tostring()
pipe.communicate(input = im)
pipe.stdin.close()
if pipe.stderr is not None:
pipe.stderr.close()
pipe.wait()
编辑: 显然使用Popen.communicate打破了管道(感谢Peter Wood!)。
在修复了管道破坏的情况后,我遇到了另一个问题,在向视频写入~235帧之后程序崩溃了。
新编辑的脚本:
command = [ FFMPEG_BIN,
'-y',
'-f', 'rawvideo',
'-codec', 'rawvideo',
'-s', '1920x1080', # size of one frame
'-pix_fmt', 'rgb24',
'-r', '24', # frames per second
'-i', '-', # The input comes from a pipe
'-an', # Tells FFMPEG not to expect any audio
'-vcodec', 'mpeg4',
'my_output_videofile.mp4' ]
pipe = sp.Popen(command, stdin = sp.PIPE, stderr = sp.PIPE)
for x in range(300):
print x
im = np.array(ImageGrab.grab()).tostring()
pipe.stdin.write(im)
pipe.stdin.flush()