1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| def BuildVideo ( images,output_filename,size,time=60 ):
'''Construit une vidéo à partir de la liste d'images.
images : liste des noms de fichiers des images
output_filename : nom de la video (attention à l'extension)
size : (largeur,hauteur) en pixels de la vidéo générée
Les paramètres du codec sont ceux trouvés dans les tutoriels de pymedia.
'''
nb_images = 1
if len(images)>1:
nb_images = len(images)
elif nb_images>=time:
frame_rate_base = 1567641600/nb_images
frame_rate = frame_rate_base*nb_images/time
rate = frame_rate/frame_rate_base
params = {
'type' : 0,
'gop_size' : 12,
# frame rate = frame_rate/frame_rate_base : ici déterminer par la duree et le nb d'images
# attention : tous les frames rate ne sont pas supportés
'frame_rate' : frame_rate_base*nb_images/time,
'frame_rate_base' : frame_rate_base,
'max_b_frames' : 0,
'height' : size[1],
'width' : size[0],
'deinterlace' : 0,
'bitrate' : 2700000,
'id' : vcodec.getCodecID( 'mpeg1video' ) }
#Lorsqu'il y a peu d'images cela pose quelques problèmes
else:
rate = 1
params = {
# frame rate = frame_rate/frame_rate_base : ici = 1 im/sec
# attention : tous les frame rate ne sont pas supportés
'frame_rate' : 1,
'frame_rate_base' : 1,
'max_b_frames' : 0,
'height' : size[1],
'width' : size[0],
'deinterlace' : 0,
'bitrate' : 2700000,
'id' : vcodec.getCodecID( 'mpeg1video' ) }
tmp = [images[0]]
for i in range(time):
pos = i*nb_images/time
tmp.append(images[pos])
images = tmp
encoder = vcodec.Encoder( params ) # créé une instance d'encodeur
output = open( output_filename,'wb' ) # créé le fichier de sortie
for i,im in enumerate(images) :
# recupère l'image sous forme d'une string raw
bitmap = Image.open( im ).resize( size ).tostring()
# en fait une frame rgb
frame_rgb = vcodec.VFrame( vcodec.formats.PIX_FMT_RGB24,size,( bitmap,None,None ))
f = frame_rgb
# la convertit en frame yuv (l'encodeur n'accepte pas directement du rgb)
frame_yuv = frame_rgb.convert( vcodec.formats.PIX_FMT_YUV420P )
# encode la frame
encoded = encoder.encode( frame_yuv )
# ajoute la frame encodée au fichier
output.write( encoded.data )
# ferme le fichier de sortie
output.close() |
Partager