Seite 1 von 1

Video gruenden mit bilder un Pymedia

Verfasst: Montag 18. Juli 2011, 12:10
von afranck64
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 :mrgreen:

Re: Video gruenden mit bilder un Pymedia

Verfasst: Mittwoch 20. Juli 2011, 10:17
von afranck64
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.

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()
Ich hoffe die Leute werden das Code ueberpruefen. :mrgreen:
<images> ist eine List von <PIL.Image>