Ответ 1
Простая комбинация PyMedia и PIL сделает трюк для файлов AVI, ASF или MPEG. PyMedia позволяет извлекать кадры (используя процедуру decoder()), в то время как PIL имеет обычную миниатюру().
Мне нужно создать эскизы для видеофайла, как только я загрузился в webapp, работающий на python.
Как бы я это делал... Мне нужна библиотека, которая в принципе может сделать это для меня, или что вы можете автоматически считывать кадры изображений из видеофайлов (нескольких форматов).
Простая комбинация PyMedia и PIL сделает трюк для файлов AVI, ASF или MPEG. PyMedia позволяет извлекать кадры (используя процедуру decoder()), в то время как PIL имеет обычную миниатюру().
Вы можете использовать ffvideo
from ffvideo import VideoStream
pil_image = VideoStream('0.flv').get_frame_at_sec(5).image()
pil_image.save('frame5sec.jpeg')
Вы можете использовать Youtube API для хранения и транскодирования и бесплатно получить миниатюры каналов. Честно говоря, это самый простой способ обработки онлайн-видео, и я не просто шиллинг стороннего сервиса, я очень счастливый пользователь этого API и внутренние пути видео, которые я смог удалить благодаря этому.
Посмотрите PythonMagick, интерфейс Python для ImageMagick. Это должно иметь то, что вам нужно. (Отказ от ответственности: я раньше не использовал интерфейс Python, но я знаю, что ImageMagick - хороший mojo.)
Я не смог установить 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])
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()
"порог" - целое число. Когда вы получаете видеокадр, он может быть очень черным, белым и т.д., Чтобы получить хороший эскиз, вы можете указать среднее значение всего пикселя в кадре.