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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #!/usr/bin/python
# -*- coding: latin-1 -*-
'''
##############################################################
# Génération d'une vidéo à partir d'une collection d'images.
##############################################################
Librairies utilisées :
======================
pymedia
--------
A télécharger ici : http://pymedia.org
La version pour python 2.5 est ici : http://pymedia.org/downloads/pymedia-1.3.7.3.win32-py2.5.exe
(Ce lien ne figure pas sur la page des téléchargements)
PIL
----
A télécharger ici : http://www.pythonware.com/products/pil/index.htm
(Penser à choisir la version pour python 2.5 !)
PIL permet de lire pratiquement tous les formats d'image.
Limitations :
==============
- A l'heure où j'écris ce code, il n'y pas de version supérieure à python 2.5 qui soit supportée par pymedia.
- Il semblerait que pymedia ajoute une image grise à la fin de la vidéo.
- Le format de vidéo généré est mpeg1 car je n'ai pas réussi à faire fonctionner correctement les autres codecs.
Lors de mes essais, j'ai pu constater que l'encodeur atteint vite ses limites :
pour une résolution supérieure à 800x800 et/ou au delà d'une cinquantaine d'images, l'encodeur rend l'âme...
- PIL fournit les binaires pour l'environnement win32.
Il faut recompiler les sources soi-même pour un autre environnement.
- enfin, pour la petite histoire, le code d'exemple (http://pymedia.org/tut/src/make_video.py.html)
que j'ai retrouvé sur beaucoup de forums est buggé, il faut écrire : "fw.write( d.data )".
'''
from PIL import Image
def BuildVideo ( images,output_filename,size ):
'''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.
'''
import pymedia.video.vcodec as vcodec
params = {'type' : 0,
'gop_size' : 12,
# frame rate = frame_rate/frame_rate_base : ici = 24 im/sec
# attention : tous les frame rate ne sont pas supportés
'frame_rate' : 2400,
'frame_rate_base' : 100,
'max_b_frames' : 0,
'height' : size[1],
'width' : size[0],
'deinterlace' : 0,
'bitrate' : 2700000,
'id' : vcodec.getCodecID( 'mpeg1video' ) }
encoder = vcodec.Encoder( params ) # créé une instance d'encodeur
output = open( output_filename,'wb' ) # créé le fichier de sortie
for im in images :
print '+',im
# 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 ))
# 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()
if __name__ == '__main__':
import os,sys
# affiche quelques infos à transmettre en cas de problème...
print 'Python %d.%d.%d (%s)'%tuple(list(sys.version_info[0:3])+[sys.executable])
print 'Construit une video a partir des images presentes dans ce repertoire.'
# génère la liste des images (il y a bien d'autres formats reconnus par PIL)
images = filter( lambda f : f[-4:] in ['.jpg','.bmp','.png'] , os.listdir('.'))
# lance la génération
BuildVideo( images , 'movie.mpeg',(640,480) ) |
Partager