我正在寻找一个Python视频处理库,类似于PIL,在那里我可以遍历源视频的所有帧,访问每帧的像素数据,绘制到每帧并将结果保存为新的视频文件。
我发现了几个类似的问题,但它们现在已经很老了:
- 最好的视频处理库Python? python视频库
他们推荐PyMedia和PyFFMPEG。PyMedia似乎相当过时(但可能仍然工作?)和PyFFMPEG,虽然最近,几乎没有文档。
我没有在Ubuntu 10.10上安装这两个,在我按下之前,是:
a)我应该看一个更好的图书馆?
b)关于如何启动和运行这些中的任何一个的良好说明?
我经常需要同样的东西,据我所知,在Python中没有好的绑定解决方案。
它也不像看起来那么简单操纵视频文件的帧。现代的视频文件格式不是一帧接一帧地存储帧,而是使用"增量帧",其中只存储从一帧到另一帧的变化。其他考虑因素,如可变帧率的视频,使问题更加困难。
在过去,我使用以下命令从视频生成图像。
ffmpeg -i /path/to/file.mpg -an -r 30 -s 320x240 tmp%06d.jpg
其中30为目标帧率,320x240为图像尺寸,tmp%06d.jpg为用于存储生成的jpeg的模式。然后,您可以使用PIL操作每个帧,并使用mencoder或ffmpeg将图像再次拼接回电影:
ffmpeg -r 30 -i tmp%06d.jpg output.mpg
显然,你会失去音轨。
我向您推荐scikit-video,这是我见过的最简单的python视频处理库。
这是scikit-video项目网站上的官方介绍:
Scikit-video是为使用Python轻松处理视频而设计的。它借鉴了其他成功的科学工具的精神,如科学工具学习和科学工具图像。scikit-video的开发人员知道存在用于操作视频的库,例如PyFFmpeg、MoviePy、PyAV、imageIO和opencv。然而,目前还没有找到能够提供研究级视频处理工具的一体化解决方案的库。
我一直在考虑使用py。加工类似的工作。它可以完成您要求的所有操作,但它是Processing的混合体。您不是在编写python代码本身。无论如何,它使它很容易工作,但有很多程序/解释开销,所以它可以做实时修改的电影很慢。你说你想编辑成文件,这样应该是可行的。
您可以使用我的VidGear视频处理python库的WriteGear API,它允许我们在压缩模式下利用FFmpeg 支持的几乎所有可用参数(帧率,比特率,编解码器,格式和大小,mux, demux等),轻松灵活,同时它会非常安静地处理错误/警告。
参数:
例如,要使用H.264使用编码器x264产生高质量的视频,我们可以调整其参数如下,以产生无损输出视频:
output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast", "tune": "zerolatency"}
,然后将这个字典传递给WriteGear,如下面的例子
基本使用示例
# import libraries
from vidgear.gears import WriteGear
import cv2
output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer
stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device
writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4'
# infinite loop
while True:
(grabbed, frame) = stream.read()
# read frames
# check if frame empty
if not grabbed:
#if True break the infinite loop
break
# {do something with frame here}
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# write a modified frame to writer
writer.write(gray)
# Show output window
cv2.imshow("Output Frame", frame)
key = cv2.waitKey(1) & 0xFF
# check for 'q' key-press
if key == ord("q"):
#if 'q' key-pressed break out
break
cv2.destroyAllWindows()
# close output window
stream.release()
# safely close video stream
writer.close()
# safely close writer
在这里查看更多高级使用细节,在这里查看完整文档
我发现imageio是最容易使用的Python视频处理库。使阅读视频帧逐帧,他们的处理和保存回磁盘轻而易举。现在,作者还为ffmpeg提供了一个易于pip安装的包装器,可以在Windows、Linux或OSX中使用。这里还有一个活跃的社区,在[python-imageio]标签下回答与库相关的问题。