使用 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 从视频文件创建缩略图的主要内容,如果未能解决你的问题,请参考以下文章