2009-11-20 6 views
17

Мне нужно создать миниатюры для видеофайла, как только я загружу веб-приложение, работающее под управлением python.Создание эскизов из видеофайлов с помощью Python

Как бы я это сделал ... Мне нужна библиотека, которая в принципе может сделать это для меня или может автоматически считывать рамы изображений из видеофайлов (нескольких форматов).

+1

См [этот ответ] [1] для того, как сделать это с Gstreamer и Python. [1]: http://stackoverflow.com/a/16478342/1049318 –

ответ

8

Простая комбинация PyMedia и PIL сделала бы трюк для файлов AVI, ASF или MPEG. PyMedia позволяет извлекать фреймы (используя процедуру decoder()), в то время как PIL имеет простую миниатюру().

+0

Очень высокая оценка. – Alterlife

+0

PyMedia не работает на python 3.x у вас есть другое возможное решение? – EduardoMaia

+0

@EduardoMaia В эти дни я, вероятно, начну с вызова внешнего пакета, например ffmpeg, или libav на https://libav.org/. –

1

Посмотрите на PythonMagick, интерфейс Python для ImageMagick. Это должно иметь то, что вам нужно. (Отказ от ответственности: я раньше не использовал интерфейс Python, но я знаю, что ImageMagick - хороший mojo.)

3

Вы можете использовать API Youtube для хранения и транскодирования и бесплатно получить миниатюры каналов. Честно говоря, это самый простой способ обработки онлайн-видео, и я не просто шиллинг стороннего сервиса, я очень счастливый пользователь этого API и внутренние пути видео, которые я смог удалить благодаря этому.

10

Вы можете использовать ffvideo "порог"

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

ffvideo не работает на python 3.x есть ли у вас другое возможное решение? – EduardoMaia

0
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_widht, thumb_height), 0, 0, cv2.INTER_LINEAR) 
#to save we have two options 
#1) save on a file 
cv2.imwrite(save_on_filename) 
#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() 

является целым числом. Когда вы получаете видеокадр, он может быть очень черным, белым и т. Д., Чтобы получить хороший эскиз, вы можете указать среднее значение всего пикселя в кадре.

2

Не удалось установить ffvideo на OSX Sierra, поэтому я решил работать с 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]) 
Смежные вопросы