什么是一个很好的Python库来操纵视频文件的帧?

时间:2011-04-11 09:08:43

标签: python video video-processing

我正在寻找一个类似于PIL的Python视频处理库,我可以在其中迭代源视频的所有帧,访问每个帧的像素数据,绘制到每个帧并保存结果作为新的视频文件。

我发现了几个类似的问题,但现在已经很老了:

他们建议PyMediaPyFFMPEG。 PyMedia似乎已经过时了(但可能仍然有用吗?)和PyFFMPEG,而最近几乎没有文档。

我没有运气在Ubuntu 10.10上安装这些,在我按下之前,就在那里:

a)我应该看一个更好的图书馆?

b)关于如何启动和运行其中任何一项的良好说明?

4 个答案:

答案 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