程序化生成小视频的缩略图CAP
如何用Python为视频制作一个简单的封面。
想法:在时间线上均匀地选择9个时间点,拍9张快照,然后把它们放在一个JPG文件里。
我该怎么做呢?
PIL是唯一的方法吗?(要实现我想要的效果是不是不太容易?)
难道没有其他模块吗?(Python似乎几乎对任何事情都有很棒的模块,难道我运气不好吗?)
示例:
Movie lenght = 10 min
T1= snapshot of 1 min
T2= snapshot of 2 min
......
T9= snapshot of 9 min
| |
T1| T2| T3
---+---+---
T4| T5| T6
---+---+---
T7| T8| T9
| |
1 个回答
7
这是我之前做过的一项小改动,使用ffmpeg来提取帧,然后用PIL来创建完整的缩略图。
import os, sys
from PIL import Image
# Use "ffmpeg -i <videofile>" to get total length by parsing the error message
chout, chin, cherr = os.popen3("ffmpeg -i %s" % sys.argv[1])
out = cherr.read()
dp = out.index("Duration: ")
duration = out[dp+10:dp+out[dp:].index(",")]
hh, mm, ss = map(float, duration.split(":"))
total = (hh*60 + mm)*60 + ss
# Use "ffmpeg -i <videofile> -ss <start> frame<nn>.png" to extract 9 frames
for i in xrange(9):
t = (i + 1) * total / 10
os.system("ffmpeg -i %s -ss %0.3fs frame%i.png" % (sys.argv[1], t, i))
# Make a full 3x3 image by pasting the snapshots
full = None
for y in xrange(3):
for x in xrange(3):
img = Image.open("frame%i.png" % (y*3+x))
w, h = img.size
if full is None:
full = Image.new("RGB", (w*3, h*3))
full.paste(img, (x*w, y*h))
# Save result
full.save("thumbs.png")