如何使用Python从视频中提取幻灯片

10
我有一个AVI文件作为录制的视频培训课程。大部分屏幕是作为幻灯片展示的,并在其中移动鼠标指针。
我想在屏幕切换时自动捕获幻灯片的截图(忽略由于鼠标指针移动而导致的图像微小变化)。
我想这么做是为了将这些图像粘贴到一个word或html文档中,以便我可以在学习时添加笔记,因为目前我正在截屏,但这非常缓慢和繁琐,而且课程非常长(总播放时间约为24小时)。
我很了解Python,但不确定如何从视频文件中提取静止图片,然后如何比较一张图片与另一张图片之间的差异,以决定哪些保留,哪些丢弃。
有人能建议如何实现吗?

2
我已经构建了一个名为slide-extractor的Python包,它可以完全实现您想要做的事情。您可以在此处查看它:https://pypi.org/project/slide-extractor/1.0.0/。如果您想自己制作类似的东西,也可以从其源代码中获得灵感。 - Vivek Anand
3个回答

14

ffmpeg这样的工具适合从视频中提取图像。从手册上可以看到:

 ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

这将从视频中每秒提取一帧图像,并将它们输出到名为foo-001.jpegfoo-002.jpeg等文件中。图像将被重新调整大小以适应新的WxH值。

然后可以使用PIL和/或OpenCV来比较它们之间的差异。

编辑:我刚才意识到,只抓取关键帧(帧内)可能会更有效,因为这些发生在场景发生剧烈变化时。稍微谷歌一下,我们就有了这个:

ffmpeg -i foo.avi -vsync 0 -vf select="eq(pict_type\,PICT_TYPE_I)" -s WxH -f image2 foo-%03d.jpeg

谢谢。第二个例子我无法使用,即使使用最新版本的ffmpeg也不行。第一个例子对我所需的工作。 - zio
@zio 请确保您设置所需的宽度和高度参数(WxH),例如1280x720,最终命令将如下所示:./ffmpeg -i foo.avi -vsync 0 -vf select="eq(pict_type,PICT_TYPE_I)" -s 1280x720 -f image2 foo-%03d.jpeg - Enrique G
当我在一个mp4视频文件上运行第一条命令时,出现了“无效的帧大小:WxH”错误。 - Teddy C

5
您需要的基本上是场景检测。Python中的framedifferenceanalyzer是一个教育性的概念验证,正是做这件事情的,并且应该为学习问题本身提供了一个很好的起点。
至于自己实现,ffmpeg是将视频转换为帧序列的理想工具 - 我可能不会尝试在纯Python中完成这部分。
对于计算帧之间的差异,您可以使用ImageMagick(特别是其compare工具)。有几个Python绑定可用于ImageMagick,例如PythonMagickmagickwand等。
您还可以使用OpenCV进行图像分析。OpenCV是高性能、高质量的计算机视觉算法库,可能是最强大的工具之一,可以做类似于这样的事情。然而,它假设您对计算机视觉/图像处理有一定的了解,并且已经对您要寻找的内容有一个很好的想法。

谢谢。比较工具和Python中的ImageMagick对我非常有用。 - zio

2

从视频演示中提取幻灯片/帧数有几个原因,尤其是在教育或会议相关视频的情况下。它可以让您在不观看整个视频的情况下访问学习笔记。

我已经多次面临这个问题,所以我决定使用Python自己创建一个解决方案。我已经将代码开源,您可以轻松设置此工具并在几个简单的步骤中运行它。

参考YouTube视频教程了解如何使用此工具的步骤。

  • 克隆此项目
  • 通过运行 "pip install -r requirements.txt" 来设置您的环境
  • 复制您的视频路径
  • 运行 "python video2pdfslides.py <video_path>"

嘭! PDF幻灯片将在输出文件夹中可用。做笔记并享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接