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

使用Python从视频文件创建缩略图,python,video,thumbnails,Python,Video,Thumbnails,一旦我上传到运行python的webapp,我需要为视频文件创建缩略图 我该怎么做。。。我需要一个基本上可以为我这样做的库,或者可以从视频文件(多种格式)中自动读取图像帧。查看,ImageMagick的Python接口。那应该有你需要的。(免责声明:我以前没有使用过Python接口,但我知道ImageMagick是一种很好的mojo。)简单的and组合可以用于AVI、ASF或MPEG文件。PyMedia允许您提取帧(使用decoder()例程),而PIL有一个简单的缩略图()例程。您可以使用Yo

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


我该怎么做。。。我需要一个基本上可以为我这样做的库,或者可以从视频文件(多种格式)中自动读取图像帧。

查看,ImageMagick的Python接口。那应该有你需要的。(免责声明:我以前没有使用过Python接口,但我知道ImageMagick是一种很好的mojo。)

简单的and组合可以用于AVI、ASF或MPEG文件。PyMedia允许您提取帧(使用decoder()例程),而PIL有一个简单的缩略图()例程。

您可以使用Youtube API进行存储和转码,并免费获取提要缩略图。老实说,这是处理在线视频最简单的方法,我不仅仅是一个第三方服务的先令,我很高兴使用这个API和我能够删除的内部视频路径。你可以使用

从ffvideo导入视频流
pil_image=VideoStream('0.flv')。在第(5)秒处获取帧。image()
pil_image.save('frame5sec.jpeg'))
导入cv2
vcap=cv2.VideoCapture(文件名)
res,im_ar=vcap.read()
而im_.mean()<阈值和分辨率:
res,im_ar=vcap.read()
im_ar=cv2.调整大小(im_ar,(拇指宽度,拇指高度),0,0,cv2.内部线性)
#为了节省开支,我们有两个选择
#1) 保存在文件中
imwrite(保存在文件名im上)
#2) 保存在直接传输的缓冲区上
res,thumb_buf=cv2.imencode('.png',im_ar)
#允许使用“.jpeg”等
#获取字节内容
bt=thumb_buf.tostring()

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

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

OSX:

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])

您可以使用GitHub上的Python脚本(使用),以及PIL fork。它应该为您完成全部工作。

有关如何使用Gstreamer和Python的信息,请参见[此答案][1]。[1] :PyMedia无法在python 3.x上运行您有其他可能的解决方案吗?@EduardoMaia这些天我可能会首先调用外部包,如ffmpeg或libav at。我正在使用ffmpeg。只是,当您与其他人一起工作时,如果它是python包,那么就更容易了。我只是把它放在requirements.txt里,他们只是把它和其他东西一起安装。。。但是,当它是一个外部软件包时,他们必须安装它,将环境变量放入虚拟环境的激活脚本中,以及所有这些东西…@EduardoMaia,这是一个很好的观点。不幸的是,我最近没有对视频做任何事情,所以我不能提供更好的答案。如果您找到了,请告诉我,我可以将其包含在答案中。ffvideo在python 3.x上不起作用,您有其他可能的解决方案吗?这是2019年的有效答案我正在获取流#0:0->#0:0(h264(本机)->png(本机))按[q]停止,[?]如需帮助,在EOF错误标记过滤器为已完成错误后,无法确定输入流0:0的格式。有什么建议吗?如果网站是一个内容管理系统,用户可以上传自己的视频,那么这样做是否可行?在这种情况下,您将如何在youtube上存储视频?你需要在YouTube上有一个频道,但你不知道用户是否在YouTube上有帐户。我是对的还是遗漏了什么?
apt-get install ffmpeg
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])