IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Incrustation d'image dans une vidéo


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut Incrustation d'image dans une vidéo
    Bonjour à tous,

    Je tente de réaliser une incrustation d'image contenant du texte dans une vidéo.
    Il peut s'agir d'une image a.jpg de la seconde 2 à la seconde 3 de la vidéo, puis d'une image b.jpg de la seconde 4 à 7 par exemple. Les images et timming serons surement indiqué dans une fichier à part, fichier texte, xml, au autre, c'est secondaire.

    Pour le moment, je découvre la manipulation d'image, avec ce petit code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from PIL import Image
     
    background = Image.open
     
    ("C:/Users/Yoann/Pictures/fond.png")
     
    foreground = Image.open
     
    ("C:/Users/Yoann/Pictures/texte.PNG")
     
    background.paste(foreground, (0, 0), foreground)
    background.show()
    A terme, l'idée est d'utiliser ffmpeg (ou une autre librairie) pour décomposer la vidéo en image, puis de faire l'incrustation de texte dans une série d'image, et utiliser ffmpeg pour transformer ces images incrustés en un film.

    Niveau optimisation, cela me semble bien nul

    Je me permet donc d'ouvrir ce sujet au cas où il y-aurait des suggestions.
    Je me poserais surement quelques question lors de point bloquant ; questions qui ne vont surement pas tarder à venir au fur et à mesure de l'avancement de mon projet

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut !

    Tu devrais t'orienter vers opencv, en recherchant comment ajouter une image ou du texte à une vidéo (en anglais), il y a pas mal d'exemples que l'on peut trouver sur internet pour s'en inspirer.

    Bonne chance ^^

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut
    Ah, j'ai trouvé comment faire

    Avec ffmpeg on peux incruster des logo à la chaine avec des temps différents de cette manière là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ffmpeg -i 2.mp4 -i logo1.PNG -i logo2.PNG -i logo3.PNG -i logo4.PNG -filter_complex "[0:v][1:v]overlay=100:75:enable=between(t\,1\,3):(H-h)/2[bkg];  [bkg][2:v]overlay=100:75:enable=between(t\,3\,5):(H-h)/2[bkg];  [bkg][3:v]overlay=100:75:enable=between(t\,5\,7):(H-h)/2[bkg];  [bkg][4:v]overlay=100:75:enable=between(t\,7\,9):(H-h)/2" -c:a copy output.mp4
    J'ai donc juste à trouver une moyen de générer une commande vers ffmpeg en fonction d'un fichier texte, ou xml

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut
    Le code est quasiment finit. Je publie la solution.
    Cela servira à d'autre peut-être, ou à un projet.
    Incrustation d'image dans une vidéo, via un fichier xml ressemblant au format final cut pro 6 (pour sous-titres par exemple).
    ffmpeg doit être présent. Beaucoup d'amélioration restent à faire.

    Cela permet de se passer de produit comme final cut. Ce qui peut-être très économique

    Maintenant que j'arrive à faire du code qui marche... j'espère que les talents en programmation me donnerons les conseils pour faire du code plus beau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    import os
    import io
    import sys
     
    print ()
     
    try:
        print ("dossier = ",sys.argv[1])
        print ("Fichier_xml = ",sys.argv[2])
        print ("fps = ",sys.argv[3])
        #print ("Fichier source",sys.argv[5])
        #print ("Fichier cible",sys.argv[6])
     
     
        dossier=str(sys.argv[1])
        fichier=str(sys.argv[2])
        fps=int(sys.argv[3])
        #duréemin=int(sys.argv[4])
        #sourcefile=sys.argv[5]
        #destfile=sys.argv[6]
     
    except:
        print ("utilisation incrust_xml.py C:\\Users\\Yoann\\Desktop Fichier_xml 25")
        sys.exit("Erreur lors du chargement de certains arguments de la commande")
     
    try:
        dossier=os.chdir(dossier)
    except:
        print ("impossible d'aller dans le dossier", dossier)
        sys.exit("Erreur lors du chargement de certains arguments de la commande")
     
    print ()
     
    list_image=[]
    from lxml import etree
    tree = etree.parse(fichier)
    for file in tree.xpath("/xmeml/sequence/media/video/track/clipitem/file"):
        list_image.append(file.get("id"))
     
    for file in tree.xpath("/xmeml/sequence/timecode/frame"):
        offset=(file.text)
        offset=int(offset)
     
     
    list_in=[]
    for file in tree.xpath("/xmeml/sequence/media/video/track/clipitem/in"):
        list_in.append(file.text)
     
    list_out=[]
    for file in tree.xpath("/xmeml/sequence/media/video/track/clipitem/out"):
        list_out.append(file.text)
     
    def convert_tc (frame):
     
        global offset
        frame=frame+offset
     
        seconde=0
        minute=0
        heure=0
     
        while frame>fps-1:
            frame=frame-fps
            seconde=seconde+1        
     
        while seconde >59:
            seconde=seconde-60
            minute= minute+1
     
        while  minute > 59:
            minute= minute-60
            heure=heure+1
        return (heure, minute, seconde, frame)
     
    print(list_in)
    print("offset = ", offset)
    print("#############")
     
    #exemple
    #ffmpeg -i 2-tc.mp4 -i 1.png -i 2.png -i 3.png -filter_complex "[0:v][1:v]overlay=100:75:enable=between(t\,2\,4)[bkg]; [bkg][2:v]overlay=100:75:enable=between(t\,6\,8)[bkg]; [bkg][2:v]overlay=100:75:enable=between(t\,10\,12)" -c:a copy output.mp4
     
     
    command_header="ffmpeg -i \"blabla.mov\" "
    command_footer="output.mp4"
    command_file=""
    command_tc=""
    command_add=""
    i=0    
    while i < len(list_image):
    #while i < 3:
     
        tc_in=int(list_in[i])
        print ("tc_in")
        print("frame", tc_in)
        print ("seconde", tc_in/25)
        heure,minute,seconde,frame = convert_tc(tc_in)
        print("soit ", heure,":",minute,":",seconde,":",frame)
     
        print(list_image[i])
     
        tc_out=int(list_out[i])
        print("tc_out")
        print ("frame", tc_out)
        print ("seconde", tc_out/25)
        heure,minute,seconde,frame = convert_tc(tc_out)
        print("tc_out = ", heure,":",minute,":",seconde,":",frame)
        print()
     
        command_file=command_file+"-i "+list_image[i]+" "
        #print (command_file)
     
        print (i)
        if i==0:
            command_add="-filter_complex \"[0:v][1:v]overlay=0:0:enable=between(t\,"+str(tc_in/25)+"\,"+str(tc_out/25)+")[bkg]; "
        if i>0:
            if i<len(list_image)-1:
            #if i<3-1:
                command_add="[bkg]["+str(i+1)+":v]overlay=0:0:enable=between(t\,"+str(tc_in/25)+"\,"+str(tc_out/25)+")[bkg]; "
            else:
                command_add="[bkg]["+str(i+1)+":v]overlay=0:0:enable=between(t\,"+str(tc_in/25)+"\,"+str(tc_out/25)+")\" "
        command_tc=command_tc+command_add
        #print (command_tc)
     
        i=i+1
    print()
    print()
    command=command_header+command_file+command_tc+command_footer
    print (command) 
    print()  
    print()
     
     
    os.system(command)
    Voilà un exemple d'une partie d'un xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xmeml>
    <xmeml version="1">
        <sequence id="blabla_TRANSCRIPT_XML titles">
            <name>blabla_TRANSCRIPT_XML titles</name>
            <duration>1943</duration>
            <rate>
                <ntsc>FALSE</ntsc>
                <timebase>25</timebase>
            </rate>
            <timecode>
                <string>00:00:00:06</string>
                <frame>6</frame>
            </timecode>
            <media>
                <video>
                    <format>
                        <samplecharacteristics>
                            <width>1920</width>
                            <height>1080</height>
                            <anamorphic>FALSE</anamorphic>
                            <pixelaspectratio>PAL-CCIR-601</pixelaspectratio>
                        </samplecharacteristics>
                    </format>
                    <track>
                        <clipitem>
                            <name>blabla_TRANSCRIPT_0001.PNG</name>
                            <duration>77</duration>
                            <in>0</in>
                            <out>77</out>
                            <start>0</start>
                            <end>77</end>
                            <stillframe>TRUE</stillframe>
                            <anamorphic>FALSE</anamorphic>
                            <pixelaspectratio>PAL-CCIR-601</pixelaspectratio>
                            <alphatype>straight</alphatype>
                            <file id="blabla_TRANSCRIPT_0001.PNG">
                                <name>blabla_TRANSCRIPT_0001.PNG</name>
                                <pathurl>./blabla_TRANSCRIPT_0001.PNG</pathurl>
                                <media>
                                    <video>
                                        <duration>77</duration>
                                        <stillframe>TRUE</stillframe>
                                        <samplecharacteristics>
                                            <width>1920</width>
                                            <height>1080</height>
                                            <pixelaspectratio>PAL-CCIR-601</pixelaspectratio>
                                            <alphatype>straight</alphatype>
                                        </samplecharacteristics>
                                    </video>
                                </media>
                            </file>
                        </clipitem>
                        <clipitem>
                            <name>blabla_TRANSCRIPT_0002.PNG</name>
                            <duration>58</duration>
                            <in>82</in>
                            <out>140</out>
                            <start>82</start>
                            <end>140</end>
                            <stillframe>TRUE</stillframe>
                            <anamorphic>FALSE</anamorphic>
                            <pixelaspectratio>PAL-CCIR-601</pixelaspectratio>
                            <alphatype>straight</alphatype>
                            <file id="blabla_TRANSCRIPT_0002.PNG">
                                <name>blabla_TRANSCRIPT_0002.PNG</name>
                                <pathurl>./blabla_TRANSCRIPT_0002.PNG</pathurl>
                                <media>
                                    <video>
                                        <duration>58</duration>
                                        <stillframe>TRUE</stillframe>
                                        <samplecharacteristics>
                                            <width>1920</width>
                                            <height>1080</height>
                                            <pixelaspectratio>PAL-CCIR-601</pixelaspectratio>
                                            <alphatype>straight</alphatype>
                                        </samplecharacteristics>
                                    </video>
                                </media>
                            </file>
                        </clipitem>

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut subprocess
    Je suis bloqué sur un problème, et j'ai passé l'après midi dessus...

    Comme une ligne de commande est limité en taille, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ffmpeg -i 2.mp4 -i logo1.PNG -i logo2.PNG -i logo3.PNG -i logo4.PNG -filter_complex "[0:v][1:v]o
    finit par poser problème.

    Je tente de passer par subprocess, mais il me faut construire une ligne dont le nombre d’arguments est variable, je m'explique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call(['/incrust/bin/ffmpeg.exe', '-y', '-i', movie, '-i', 'logo1.PNG', 'output.mp4'], shell=True)
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call(['/incrust/bin/ffmpeg.exe', '-y', '-i', movie, '-i', 'logo1.PNG',  '-i', 'logo2.PNG,  'output.mp4'], shell=True)
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call(['/incrust/bin/ffmpeg.exe', '-y', '-i', movie, '-i', 'logo1.PNG',  '-i', 'logo2.PNG,   '-i', 'logo3.PNG, 'output.mp4'], shell=True)
    La première idée est de remplacer <<, '-i', 'logo1.PNG', '-i', 'logo2.PNG,>> par une variable mais cela est sans succès, car subprocess fait alors cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/incrust/bin/ffmpeg.exe', '-y', '-i', movie, ma_liste, 'output.mp4'
    -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /incrust/bin/ffmpeg.exe', '-y', '-i', movie, ", '-i', 'logo1.PNG',  '-i', 'logo2.PNG",  'output.mp4
    Je ne vois pas comment contourner cela. J'ai même tenter de faire passer un string dans subprocess, sans réussite.

    Quelqu'un sait ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> movie = 'XXXXXXXXX'
    >>> [ movie ]
    ['XXXXXXXXX']
    >>>
    donc Python sait très bien remplacer une variable dans une liste...
    Par contre shell=True, çà à votre place je relirai la documentation et je ferais des tests avec des commandes de base comme /usr/bin/ls

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Objective-C] comment afficher dans un scrollview une image ou une vidéo puis du texte?
    Par Seelass dans le forum Objective-C
    Réponses: 0
    Dernier message: 17/07/2012, 15h55
  2. Réponses: 4
    Dernier message: 30/03/2012, 04h48
  3. Chercher une image dans une Vidéo
    Par bartmanb dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 24/01/2009, 00h05
  4. Réponses: 3
    Dernier message: 05/03/2008, 12h43
  5. incrustation logo dans une vidéo de manière "automatique"
    Par samtheh dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 09/10/2007, 19h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo