使用 Python 从视频文件创建缩略图

Posted

技术标签:

【中文标题】使用 Python 从视频文件创建缩略图【英文标题】:Creating thumbnails from video files with Python 【发布时间】:2010-12-18 20:37:43 【问题描述】:

上传到运行 python 的 webapp 后,我需要为视频文件创建缩略图。

我将如何处理...

【问题讨论】:

请参阅 [this answer][1] 了解如何使用 Gstreamer 和 Python 进行操作。 [1]:***.com/a/16478342/1049318 【参考方案1】:

查看PythonMagick,这是 ImageMagick 的 Python 接口。那应该有你需要的。 (免责声明:我以前没有使用过 Python 接口,但我知道 ImageMagick 是个好东西。)

【讨论】:

【参考方案2】:

PyMedia 和PIL 的简单组合可以处理 AVI、ASF 或 MPEG 文件。 PyMedia 允许您提取帧(使用 decoder() 例程),而 PIL 有一个简单的 thumbnail() 例程。

【讨论】:

PyMedia 在 python 3.x 上不工作你有其他可能的解决方案吗? @EduardoMaia 这些天我可能会首先调用外部包,如 ffmpeg 或 libav.org 的 libav。 我正在使用 ffmpeg。只是,当你和其他人一起工作时,如果它是一个 python 包会更容易。我只是将它放在 requirements.txt 中,他们只是将它与其他东西一起安装......但是当它是一个外部包时,他们必须安装它,将环境变量放在他们的虚拟环境的激活脚本中,以及所有这些东西... @EduardoMaia 好点。不幸的是,我最近不需要对视频做任何事情,所以我无法提供更好的答案。如果您找到了,请告诉我,我可以将其包含在答案中。【参考方案3】:

您可以使用 Youtube API 进行存储和转码,并免费获取提要缩略图。老实说,这是处理在线视频的最简单方法,而且我不只是在向 3rd 方服务先令,我对该 API 和内部视频路径的使用非常满意,感谢它,我能够删除内部视频路径。

【讨论】:

如果网站是一个内容管理系统,用户可以上传自己的视频,那么这样做是否可行?在这种情况下,您将如何将视频存储在 youtube 中?您需要在 YouTube 中有一个频道,但您不知道该用户是否在 YouTube 中有一个帐户。我是正确的还是我遗漏了什么?【参考方案4】:

您可以使用ffvideo

from ffvideo import VideoStream
pil_image = VideoStream('0.flv').get_frame_at_sec(5).image()
pil_image.save('frame5sec.jpeg')

【讨论】:

ffvideo 在 python 3.x 上不工作你有其他可能的解决方案吗?【参考方案5】:
import cv2
vcap = cv2.VideoCapture(filename)
res, im_ar = vcap.read()
while im_ar.mean() < threshold and res:
      res, im_ar = vcap.read()
im_ar = cv2.resize(im_ar, (thumb_width, thumb_height), 0, 0, cv2.INTER_LINEAR)
#to save we have two options
#1) save on a file
cv2.imwrite(save_on_filename, im_ar)
#2)save on a buffer for direct transmission
res, thumb_buf = cv2.imencode('.png', im_ar)
# '.jpeg' etc are permitted
#get the bytes content
bt = thumb_buf.tostring()

“阈值”是一个整数。当您获得一个视频帧时,它可以是非常黑色、白色等以获得一些好的缩略图,您可以指定帧中所有像素的平均值。

【讨论】:

【参考方案6】:

我无法在 OSX Sierra 上安装 ffvideo,所以我决定使用 ffmpeg。

OSX:

brew install ffmpeg

Linux:

apt-get install ffmpeg

Python 3 代码:

import subprocess
video_input_path = '/your/video.mp4'
img_output_path = '/your/image.jpg'
subprocess.call(['ffmpeg', '-i', video_input_path, '-ss', '00:00:00.000', '-vframes', '1', img_output_path])

【讨论】:

这是 2019 年的有效答案 我得到 Stream #0:0 -> #0:0 (h264 (native) -> png (native)) 按 [q] 停止,[?] 寻求帮助 无法确定格式EOF 错误将过滤器标记为已完成错误后的输入流 0:0。有什么建议吗?【参考方案7】:

您可以使用在 GitHub 上找到的 Python 脚本 pyvideothumbnailer,该脚本使用 MoviePy、MediaInfo 和 PIL fork Pillow。它应该为您完成全部工作。

【讨论】:

【参考方案8】:

使用 pyffmpeg

安装

pip install pyffmpeg

使用

from pyffmpeg import FFmpeg

inf = 'vid.mp4'
outf = 'thumb.jpg'

ff = FFmpeg()
ff.convert(inf, outf)

【讨论】:

以上是关于使用 Python 从视频文件创建缩略图的主要内容,如果未能解决你的问题,请参考以下文章

如何统一创建缩略图

是否有 Python 库可以为各种文档文件格式创建缩略图?

从视频网址创建缩略图!

从使用 AVAssetWriter 创建的视频生成缩略图

使用 php GD 创建 MP4 视频缩略图

Android:如何获取应用程序私有文件的视频缩略图?