我正在寻找一个类似于PIL的Python视频处理库,我可以在其中迭代源视频的所有帧,访问每个帧的像素数据,绘制到每个帧并保存结果作为新的视频文件。
我发现了几个类似的问题,但现在已经很老了:
他们建议PyMedia和PyFFMPEG。 PyMedia似乎已经过时了(但可能仍然有用吗?)和PyFFMPEG,而最近几乎没有文档。
我没有运气在Ubuntu 10.10上安装这些,在我按下之前,就在那里:
a)我应该看一个更好的图书馆?
b)关于如何启动和运行其中任何一项的良好说明?
答案 0 :(得分:7)
我经常需要同样的东西,据我所知,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
显然,你将失去音轨。
答案 1 :(得分:2)
我一直在考虑使用py.processing进行类似的工作。它可以满足您的所有要求,但却与Processing混合使用。你本身并不是在编写python代码。无论如何,它使得它很容易使用,但是有很多程序/解释开销,因此对电影进行实时修改可能会很慢。你说你想要编辑到文件,这应该是可行的。
答案 2 :(得分:1)
我推荐scikit-video给你,这是我见过的最简单的python视频处理库。
这是其项目网站上的scikit-video官方介绍:
Scikit-video旨在使用Python轻松进行视频处理。它以其他成功的scikits精神为模型,如scikit-learn和scikit-image。 scikit-video知识库的开发者存在用于操纵视频,例如PyFFmpeg,MoviePy,PyAV,imageIO和opencv。但是,没有找到任何图书馆为研究级视频处理工具提供一体化解决方案。
答案 3 :(得分:0)
您可以使用我的VidGear视频处理python库的WriteGear API,使我们能够利用FFmpeg 支持的几乎所有可用参数(帧率,比特率,编解码器,格式和大小,多路复用器,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
查看更多高级用法详细信息Compression Mode和完整文档here