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轻松进行视频处理。 它的设计灵感来自于其他成功的scikits,例如scikit-learn和scikit-image。 scikit-video的开发人员知道存在用于操作视频的库,例如PyFFmpeg,MoviePy,PyAV,imageIO和opencv。 但是,没有发现提供研究级别的视频处理工具的全能解决方案的库。
我一直在考虑使用py.processing来完成类似的工作。它可以做到你所需要的一切,但它是一个混合体与Processing。你并不是在写Python代码本身。 无论如何,它使得工作变得非常容易,但有很多程序/解释开销,因此实时修改电影可能会很慢。你说你想编辑文件,所以应该是可行的。
我发现imageio是最容易使用的Python视频处理库。 它可以轻松地逐帧读取视频、进行处理并保存回磁盘。现在,作者还提供了一个方便的pip install wrapper for ffmpeg,可以在Windows、Linux或OSX上使用。这个库还有一个活跃的社区,在[python-imageio]标签下回答与该库相关的问题。
你可以使用我的VidGear视频处理Python库的WriteGear API来利用FFmpeg支持的几乎所有可用参数(帧速率、比特率、编解码器、格式和大小、复用、解复用等)在压缩模式中轻松灵活地进行操作,同时它会非常静默地稳定处理整个过程中的所有错误/警告。
例如,为了使用x264编码器生成高质量视频的H.264,我们可以按以下方式调整其参数以产生无损输出视频:
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