Hallo ,
ich ,ha,be viel Bilder und moechte damit eine video gruenden. Dafuer moechte ich einen Programm gruenden der Pymedia nutzt. Leider kenne ich mich nicht gut damit.
Ich moechte aucht die Dauert der Video setzen koennen.
Dank
Video gruenden mit bilder un Pymedia
Hallo,
hier ist was ich schon gemacht habe. Aber die Dauert funktionniert nicht gut. Wenn ich z.B 60 Sekunden setze, dann dauert die Video nur c.a 50 Sekunden.
Ich hoffe die Leute werden das Code ueberpruefen.
<images> ist eine List von <PIL.Image>
hier ist was ich schon gemacht habe. Aber die Dauert funktionniert nicht gut. Wenn ich z.B 60 Sekunden setze, dann dauert die Video nur c.a 50 Sekunden.
Code: Alles auswählen
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()
<images> ist eine List von <PIL.Image>