Exemple #1
0
    def __init__(self, cheminVideoEntre, valeurNum=0, cheminMEncoder=None):

        QDialog.__init__(self)

        # === Paramètres généraux ===#

        self.repTampon = EkdConfig.getTempDir() + os.sep
        # Répertoire de sauvegarde ds le rep tampon
        self.rep_video_ext_resol = self.repTampon + "video_extension_resol" + os.sep

        # Uniquement pour Linux et MacOSX
        if os.name in ["posix", "mac"] or not cheminMEncoder:
            self.cheminMEncoder = u"mencoder"

        # Uniquement pour windows
        elif os.name == "nt" and cheminMEncoder:
            self.cheminMEncoder = unicode(cheminMEncoder)

        # chemin(s) des vidéos chargées
        self.cheminVideoEntre = cheminVideoEntre

        # valeur de la boite de spin pour l'encodage
        self.valeurNum = valeurNum

        self.fichiers = [os.path.basename(parc) for parc in self.cheminVideoEntre]

        # Appel de la fonction lanceur
        self.lanceur()
Exemple #2
0
    def checkfirsttime(self,p) : #OK QT4
      a, b, c, d = 0, 0, 0, 0
      pathname = os.path.dirname (sys.argv[0])
      refdir = os.path.abspath (pathname) + os.sep + u"videoporama" + os.sep + u"template" + os.sep
      if p=="o" :
        self.templatedir=unicode(QDir.homePath()) + os.sep + self.parent.configdir
      else :
        self.templatedir=refdir
      if (not os.path.exists(self.templatedir)) :
        print "Configuration directory doesn't exist"
        print "Create configuration directory at "+self.templatedir
        os.makedirs(self.templatedir)

      if (not os.path.exists(self.templatedir + os.sep + u"template_data.idv")) :
        d=1
        reffile=open(refdir + os.sep +u"template_data.idv","r")
        destfile=open(self.templatedir + os.sep + u"template_data.idv","w")
        destfile.write(reffile.read())
        destfile.close()

      ### check or create temporary dir
      self.T = EkdConfig.getTempDir() + os.sep + u"videoporamatmp"
      if (not os.path.exists(self.T)) :
        os.makedirs(self.T)

      if (c or d) :
        print "Configuration files not find (First time open ?)"
        if (a==c and b==d) :
          return False
        else :
          return True
      else :
        return False
Exemple #3
0
    def __init__(self, cheminVideoEntre, cheminFFmpeg=None):

        QThread.__init__(self)

        self.cancel = False

        #=== Paramètres généraux ===#

        self.repTampon = unicode(EkdConfig.getTempDir() + os.sep)
        # Répertoire de sauvegarde ds le rep tampon
        self.rep_audio = self.repTampon  + u'concat_audio' + os.sep

        # Uniquement pour Linux et MacOSX
        if os.name in ['posix', 'mac'] or not cheminFFmpeg  :
            self.cheminFFmpeg=u"ffmpeg"

        elif cheminFFmpeg :
            self.cheminFFmpeg=unicode(cheminFFmpeg)

        # Uniquement pour windows
        else :
            self.cheminFFmpeg=u"ffmpeg"

        # chemin(s) des vidéos chargées
        self.cheminVideoEntre = cheminVideoEntre
Exemple #4
0
    def __init__(self):

        # Identifiant de la classe
        self.idSection = "animation_encodage_web"
        # Pas d'"empilement" car pas de paramètre d'encodage
        self.stacked = None

        # ------------------------------------------------------------------- #
        # Chemin des répertoires temporaires pour la gestion des fichiers
        # mod (extension .mod). Ce sont (apparemment) des fichiers mpeg avec
        # une extension .mod. Les fichiers en question ont juste besoin
        # d'être renommés avec une extension .mpg avant le traitement.
        # ------------------------------------------------------------------- #
        self.repTempEntree = EkdConfig.getTempDir() + os.sep
        # création des répertoires temporaires
        if os.path.isdir(self.repTempEntree) is False:
            os.makedirs(self.repTempEntree)
        # Chemin exact d'écriture pour le tampon des fichiers mod
        self.repTempFichiersMod = self.repTempEntree + "transcodage" + os.sep + "fichiers_mod" + os.sep
        # Création du chemin
        if os.path.isdir(self.repTempFichiersMod) is False:
            os.makedirs(self.repTempFichiersMod)
        # Epuration/elimination des fichiers tampon contenus dans le rep tampon
        for toutRepTemp in glob.glob(self.repTempFichiersMod + "*.*"):
            os.remove(toutRepTemp)

        # ----------------------------------------------------------------------------------
        # Paramètres de la liste de combo: [(identifiant, nom entrée, instance, extension), ...]
        # ----------------------------------------------------------------------------------

        self.listeCombo = [
            ("youtube_16/9_HQ", _(u"Transcodage YouTube 16/9 Haute Qualité"), 0, ".avi"),
            ("youtube_16/9_MQ", _(u"Transcodage YouTube 16/9 Moyenne Qualité"), 1, ".avi"),
            ("youtube_16/9_LQ", _(u"Transcodage YouTube 16/9 Basse qualité"), 2, ".avi"),
            ("youtube_4/3_HQ", _(u"Transcodage YouTube 4/3 Haute Qualité"), 3, ".avi"),
            ("youtube_4/3_MQ", _(u"Transcodage YouTube 4/3 Moyenne Qualité"), 4, ".avi"),
            ("youtube_4/3_LQ", _(u"Transcodage YouTube 4/3 Basse qualité"), 5, ".avi"),
            ("google_video_16/9_HQ", _(u"Transcodage Google vidéo 16/9 Haute qualité"), 6, ".avi"),
            ("google_video_16/9_MQ", _(u"Transcodage Google vidéo 16/9 Qualité moyenne"), 7, ".avi"),
            ("google_video_16/9_LQ", _(u"Transcodage Google vidéo 16/9 Basse qualité"), 8, ".avi"),
            ("google_video_4/3_HQ", _(u"Transcodage Google vidéo 4/3 Haute qualité"), 9, ".avi"),
            ("google_video_4/3_MQ", _(u"Transcodage Google vidéo 4/3 Qualité moyenne"), 10, ".avi"),
            ("google_video_4/3_LQ", _(u"Transcodage Google vidéo 4/3 Basse qualité"), 11, ".avi"),
            ("dailymotion_sd_4/3", _(u"Transcodage Dailymotion SD 4/3"), 12, ".mp4"),
            ("dailymotion_sd_16/9", _(u"Transcodage Dailymotion SD 16/9"), 13, ".mp4"),
            ("dailymotion_HD720p", _(u"Transcodage Dailymotion HD720p"), 14, ".mp4"),
        ]

        # ---------------------------
        # Dérivation de la classe
        # ---------------------------
        Base_EncodageFiltre.__init__(self, titre=_(u"Transcodage: Pour le Web"))
	def __init__(self, statusBar, parent=None):
		vbox=QVBoxLayout()

		#=== Variable de configuration ===#
		self.config=EkdConfig

		# Identifiant de la classe
		self.idSection = "animation_montage_video_et_audio"

		super(Animation_MontagVideoVidPlusAudio, self).__init__(boite='vbox', titre=_(u"Montage: Vidéo et audio"))
		self.printSection()

		self.repTampon = EkdConfig.getTempDir() + os.sep

		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)

		# Au cas où le répertoire existait déjà et qu'il n'était pas vide -> purge (simple précaution)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)

		# Liste de fichiers initiaux (contenu dans le fichier de configuration)
		self.lstFichiersSource = []
		self.lstFichiersSourceProv = [] # idem mais provisoire (sert à récupérer les chemins dans l'ordre de sélection)

		self.lstFichiersSourceAudio = []
		self.lstFichiersSourceProvAudio = []

		# Par soucis de lisibilité, on préfère ne pas utiliser des objets présent dans le parent de cette façon
		# mais plutôt le passer en paramètre (le code est plus facile à lire de cette façon)
		self.statusBar = statusBar

		#-------------------------------------------------------------------
		self.afficheurVideoSource=SelectWidget(extensions = ["*.avi", "*.mpg", "*.mpeg", "*.mjpeg", "*.flv", "*.mp4", "*.h264", "*.dv", "*.vob"], mode="texte", video = True)
		###################################################################################
		# Onglets
		self.indexVideoSource = self.add(self.afficheurVideoSource, _(u'Video(s) source'))
		self.connect(self.afficheurVideoSource,SIGNAL("fileSelected"),self.getFile)
		self.connect(self.afficheurVideoSource, SIGNAL("pictureChanged(int)"), self.getFile)
		#--------------------------------------------------------------------


		# -------------------------------------------------------------------
		# Boîte de groupe : "Fichiers source"
		# -------------------------------------------------------------------
		extFormat=[]
		for fmt in parent.soxSuppFormat :
			extFormat.append("*."+fmt)

		self.afficheurAudioSource=SelectWidget(extensions=extFormat ,mode="texte", audio = True)
		# Onglets
		self.indexAudioSource = self.add(self.afficheurAudioSource, _(u'Audio(s) source'))
		self.connect(self.afficheurAudioSource,SIGNAL("fileSelected"), self.getFileA)
		self.connect(self.afficheurAudioSource, SIGNAL("pictureChanged(int)"),  self.getFileA)
		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = ["video","audio"] # Défini le type de fichier source.
		self.typeSortie = "video" # Défini le type de fichier de sortie.
		self.sourceEntrees = [self.afficheurVideoSource, self.afficheurAudioSource] # Fait le lien avec le sélecteur de fichier source.


		self.addReglage("vbox")
		#=== Widget qui seront inclus dans la boite de réglage ===#
		self.ordreVideo = selectJoinMultipleSound(0, self)
		self.ordreVideo.setTitleAndTips(_(u"Fichiers vidéos à joindre"), _(u"Liste des fichiers vidéo à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>"))
		self.ordreAudio = selectJoinMultipleSound(0, self)
		self.ordreAudio.setTitleAndTips(_(u"Fichiers audios à joindre"), _(u"Liste des fichiers audio à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>")) 

		self.layoutReglage.addWidget(self.ordreVideo)
		self.layoutReglage.addWidget(self.ordreAudio)

		# ---------------------------
		# Boite de groupe de mplayer
		# ---------------------------
		self.addPreview()
		self.addLog()
Exemple #6
0
    def demarrerEncodeur(self, encodeur):
        """démarrage de mencoder avec les arguments choisis"""

        if self.estLancee == False: # pas question de démarrer 2 fois l'encodage
            commande = None
            has_audio = False

            debug('\n')

            # Si la conversion d'images en vidéo est sélectionné, aucune
            # info Mplayer n'est affichée (problème de récup infos par Mplayer)
            if self.idCodec in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']:
                # ICI SI LES FICHIERS CHARGES SONT DES IMAGES
                a = "###############################"
                b = "# Informations sur les images :"
                c = "###############################"

                infos = '\n'+a+'\n'+b+'\n'+c+'\n'
                debug(infos)
                self.zoneTexte.append(infos)

                import glob
                # Le chemin pour l'affichage des infos sur les images ne fonctionnait
                # plus après la nouvelle structure des fichiers temporaires
                self.recupTempImgAnim = glob.glob(EkdConfig.getTempDir() + os.sep + "*.*")
                self.recupTempImgAnim.sort()
                # Affichage du chemin (temp) + le poids de chaque image
                # --> Une énumération de parcours a été introduite
                for parcNb, parcInfIm in enumerate(self.recupTempImgAnim):
                    debug('* '+str(parcNb+1)+'. '+parcInfIm+' --> '+str(float(os.path.getsize(parcInfIm)/1000))+' ko'+'\n')
                    self.zoneTexte.append('* '+str(parcNb+1)+'. '+parcInfIm+' --> '+str(float(os.path.getsize(parcInfIm)/1000))+' ko'+'\n')

                # Elimination de la dernière image de la liste car car elle
                # s'affiche en double ds la fenêtre information de l'encodage
                # et aussi ds la console
                #self.log = self.log[:len(self.log)-1]

                # On définie la longueur de la futur vidéo en divisant le nombre d'image par le
                # nombre d'image par seconde (valeurNum ici)
                self.ffmpegProcess.setVideoLen(len(self.recupTempImgAnim) / int(self.valeurNum))

            # Pour les traitements autres que la transformation des images en vidéo
            if self.idCodec not in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']:

                a = "########################"
                b = "# Informations MPlayer :"
                c = "########################"

                infos = '\n'+a+'\n'+b+'\n'+c+'\n'
                debug(infos)
                ######## Ajouté le 24/07/09 ##################################################################
                # Utilisation de la classe infovideo (et en particilier la fonction setVideo)
                # présents dans gui_modules_animation/infoVideo.py
                info = infovideo(self.cheminVideoEntre)

                id_filename = 'ID_FILENAME='+self.cheminVideoEntre+'\n'
                debug(id_filename)
                id_demuxer = 'ID_DEMUXER='+info.demux+'\n'
                debug(id_demuxer)
                id_video_format = 'ID_VIDEO_FORMAT='+info.videoFormat+'\n'
                debug(id_video_format)
                id_video_codec = 'ID_VIDEO_CODEC='+info.video_codec+'\n'
                debug(id_video_codec)
                id_video_bitrate = 'ID_VIDEO_BITRATE='+str(info.videoBitrate)+'\n'
                debug(id_video_bitrate)
                id_video_largeur = 'ID_VIDEO_WIDTH='+str(info.videoLargeur)+'\n'
                debug(id_video_largeur)
                id_video_hauteur = 'ID_VIDEO_HEIGHT='+str(info.videoHauteur)+'\n'
                debug(id_video_hauteur)
                id_img_par_sec = 'ID_VIDEO_FPS='+str(info.imgParSec)+'\n'
                debug(id_img_par_sec)
                ##### Donnée très importante pour la suite du calcul (pour ffmpeg.py et ffmpeg2theora) ####
                self.dureeTotaleVideo = float(info.dureeTotaleVideo)
                ###########################################################################################
                id_duree_totale_video = 'ID_LENGTH='+str(info.dureeTotaleVideo)+'\n'
                debug(id_duree_totale_video)
                id_audio_codec = 'ID_AUDIO_CODEC='+info.audioCodec+'\n'
                debug(id_audio_codec)
                id_audio_rate = 'ID_AUDIO_RATE='+str(info.audioRate)+'\n'
                debug(id_audio_rate)
                id_audio_bitrate = 'ID_AUDIO_BITRATE='+str(info.audioBitrate)+'\n'
                debug(id_audio_bitrate)

                self.zoneTexte.append(infos+id_filename+id_demuxer+id_video_format+id_video_codec+id_video_bitrate+id_video_largeur+id_video_hauteur+id_img_par_sec+id_duree_totale_video+id_audio_codec+id_audio_rate+id_audio_bitrate)
                ##############################################################################################
                ## On définie la longueur de la vidéo pour le process
                self.ffmpegProcess.setVideoLen(self.dureeTotaleVideo)

                if info.audioCodec :
                    has_audio = True

            debug('\n')

            a = "############################"
            b = "# Informations %s :" %encodeur
            c = "############################"


            infos = '\n'+a+'\n'+b+'\n'+c+'\n'
            debug(infos)
            self.zoneTexte.append(infos)

            if self.idCodec=='codec_dv_ffmpeg':
                self.ffmpegProcess.commandeFfmpegEncodageDv()
	    elif self.idCodec=='codec_mov_ffmpeg':
		#### Enlevé le 09/04/11 ##############################
		#self.ffmpegProcess.commandeFfmpegEncodageMov()
		######################################################
		#### Ajouté/rectifié le 09/04/11 #####################
                self.ffmpegProcess.commandeFfmpegEncodageMov(comp = self.valeurNum[0], size = self.valeurNum[1])
		######################################################
	    elif self.idCodec=='codec_hfyu_ffmpeg':
		#### Enlevé le 10/04/11 ##############################
                #self.ffmpegProcess.commandeFfmpegEncodageHfyu(audio = has_audio)
		######################################################
		#### Ajouté/rectifié le 10/04/11 #####################
                self.ffmpegProcess.commandeFfmpegEncodageHfyu(size = self.valeurNum, audio = has_audio)
		######################################################
            elif self.idCodec=='codec_vob_ffmpeg':
                self.ffmpegProcess.commandeFfmpegEncodageVob(vquantizer = self.valeurNum)
            elif self.idCodec=='codec_3GP_ffmpeg':
		#### Enlevé le 30/03/11 ##############################
                #self.ffmpegProcess.commandeFfmpegEncodage3gp(audio = has_audio)
		#### Ajouté/rectifié le 30/03/11 #####################
		self.ffmpegProcess.commandeFfmpegEncodage3gp(size = self.valeurNum)
		######################################################
            elif self.idCodec=='codec_AMV_ffmpeg':
		#### Rectifié le 30/03/11 ## Ajout de size ###########
                self.ffmpegProcess.commandeFfmpegEncodageAMV(size = self.valeurNum)
		######################################################
            elif self.idCodec=='idx':
                self.ffmpegProcess.commandeFfmpegNbrImgSec(rate = self.valeurNum)
            elif self.idCodec in ['mpeg1video', 'mjpeg', 'h263p', 'mpeg4', 'msmpeg4v2', 'ljpeg', 'dv', 'huffyuv', 'mov', 'flv', 'mp4', 'vob']:
                self.ffmpegProcess.commandeFfmpegConvertImg(rate = self.valeurNum, size = "%sx%s" % (self.tailleIm[0], self.tailleIm[1]), vcodec = self.idCodec)

	    # --------------------------------------------------------------------------------- #
	    # Traitement pour chaque entrée concernant la HD (classique, en dehors du codec Avid DNxHD)
	    # --------------------------------------------------------------------------------- #
            elif self.idCodec in ['hd_1920x1080_mov__pcm_s16be__16/9', 'hd_1280x720_mov__pcm_s16be__16/9', 'hd_1440x1080_mov__pcm_s16be__4/3']:
                ## FIXME : La taille est récupérée du nom de idCodec (crade)
                self.ffmpegProcess.commandeFfmpegConvHD(size = self.idCodec.split("_")[1])

	    ### Ajouté le 19/08/10 (Gestion du codec Avid DNxHD) ################################
	    # --------------------------------------------------------------------------------- #
	    # Traitement pour chaque entrée (24) concernant le codec Avid DNxHD pour la HD
	    # --------------------------------------------------------------------------------- #
            elif self.idCodec=='hd_dnxhd_1920x1080_29.97_220_mbs':
                ## FIXME : Les éléments utiles sont récupérés du nom de idCodec (crade mais utile)
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 1
	    elif self.idCodec=='hd_dnxhd_1920x1080_29.97_145_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 2
	    elif self.idCodec=='hd_dnxhd_1920x1080_25_185_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 3
	    elif self.idCodec=='hd_dnxhd_1920x1080_25_120_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 4
	    elif self.idCodec=='hd_dnxhd_1920x1080_25_36_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 5
	    elif self.idCodec=='hd_dnxhd_1920x1080_24_175_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 6
	    elif self.idCodec=='hd_dnxhd_1920x1080_24_115_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 7
	    elif self.idCodec=='hd_dnxhd_1920x1080_24_36_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 8
	    elif self.idCodec=='hd_dnxhd_1920x1080_23.976_175_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 9
	    elif self.idCodec=='hd_dnxhd_1920x1080_23.976_115_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 10
	    elif self.idCodec=='hd_dnxhd_1920x1080_23.976_36_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 11
	    elif self.idCodec=='hd_dnxhd_1920x1080_29.97_220_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 12
	    elif self.idCodec=='hd_dnxhd_1920x1080_29.97_145_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 13
	    elif self.idCodec=='hd_dnxhd_1920x1080_29.97_45_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 14
	    elif self.idCodec=='hd_dnxhd_1280x720_59.94_220_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 15
	    elif self.idCodec=='hd_dnxhd_1280x720_59.94_145_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 16
	    elif self.idCodec=='hd_dnxhd_1280x720_50_175_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 17
	    elif self.idCodec=='hd_dnxhd_1280x720_50_115_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 18
	    elif self.idCodec=='hd_dnxhd_1280x720_29.97_110_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 19
	    elif self.idCodec=='hd_dnxhd_1280x720_29.97_75_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 20
	    elif self.idCodec=='hd_dnxhd_1280x720_25_90_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 21
	    elif self.idCodec=='hd_dnxhd_1280x720_25_60_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 22
	    elif self.idCodec=='hd_dnxhd_1280x720_23.976_90_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 23
	    elif self.idCodec=='hd_dnxhd_1280x720_23.976_60_mbs':
                self.ffmpegProcess.commandeFfmpegConvHD_DNxHD(size=self.idCodec.split("_")[2], vcodec=self.idCodec.split("_")[1], rate=self.idCodec.split("_")[3], vbitrate=self.idCodec.split("_")[4]+'000k') # 24     
		#################################################################################

            elif self.idCodec=='jpeg': # convertir animation en images
                self.ffmpegProcess.commandeFfmpegConvAnimImg()
            elif self.idCodec=='extractionaudio':
                self.ffmpegProcess.commandeFfmpegSeparation()
            elif self.idCodec=='encodage_wav': # encodage de fichiers audio en wav
                self.ffmpegProcess.commandeFfmpegEncodageWav()
            elif self.idCodec=='conv_en_16_9_ou_4_3': # Convertir vidéo en 16/9 ou 4/3
                self.ffmpegProcess.commandeFfmpegConv_16_9_ou_4_3(
                            ext = os.path.splitext(self.cheminVideoEntre)[1],
                            size = "%sx%s" % (self.tailleVideo[0], self.tailleVideo[1]),
                            aspect = self.valeurNum,
                            audio = has_audio)

            # Remonté d'un niveau pour simplifier le code et éviter les répetitions
            if commande == None:
                commande = self.ffmpegProcess.command
            else :
                self.ffmpegProcess.command = commande

            debug(commande)
            self.zoneTexte.append(commande+'\n\n')
            self.ffmpegProcess.start()
            debug(u"Commande lancée")
            self.estLancee = True
	def __init__(self, statusBar):

		# -------------------------------
		# Parametres généraux du widget
		# -------------------------------

		#=== tout sera mis dans une boîte verticale ===#
		vbox=QVBoxLayout()

		#=== Variable de configuration ===#
		self.config=EkdConfig

		# Identifiant de la classe
		self.idSection = "animation_montage_video_seul"

		super(Animation_MontagVideoVidSeul, self).__init__(boite='vbox', titre=_(u"Montage: Vidéo seulement"))

		self.printSection()

		# Création des répertoires temporaires
		self.repTampon = EkdConfig.getTempDir() + os.sep

		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)

		# Au cas où le répertoire existait déjà et qu'il n'était pas vide -> purge (simple précausion)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)

		# Liste de fichiers initiaux (contenu dans le fichier de configuration)
		self.lstFichiersSource = []
		self.lstFichiersSourceProv = [] # idem mais provisoire (sert à récupérer les chemins dans l'ordre de sélection)

		self.statusBar = statusBar

		#-------------------------------------------------------------------
		self.afficheurVideoSource=SelectWidget(extensions = ["*.avi", "*.mpg", "*.mpeg", "*.mjpeg", "*.flv", "*.mp4", "*.h264", "*.dv", "*.vob"], mode="texte", video = True)

		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = "video" # Défini le type de fichier source.
		self.typeSortie = "video" # Défini le type de fichier de sortie.
		self.sourceEntrees = self.afficheurVideoSource # Fait le lien avec le sélecteur de fichier source.

		#####################################################################
		# Onglets
		self.indexVideoSource = self.add(self.afficheurVideoSource, _(u'Video(s) source'))
		self.connect(self.afficheurVideoSource,SIGNAL("fileSelected"),self.getFile)
		self.connect(self.afficheurVideoSource, SIGNAL("pictureChanged(int)"), self.getFile)
		#--------------------------------------------------------------------
		self.addReglage(boite="vbox")
		#--------------------------------------------------------------------
		#=== Widget qui seront inclus dans la boite de réglage ===#
		self.ordreVideo = selectJoinMultipleSound(0, self)
		self.ordreVideo.setTitleAndTips(_(u"Fichiers vidéos à joindre"), _(u"Liste des fichiers vidéo à joindre. <b>Pour information, vous pouvez monter et descendre les fichiers grâce aux flèches haut et bas (les fichiers apparaissant en haut de la liste sont ceux qui seront au début du montage)</b>"))
		self.layoutReglage.addWidget(self.ordreVideo)

		# ----------------------------
		# Boite de groupe de mplayer
		# ----------------------------
		self.addPreview()
		self.addLog()
Exemple #8
0
	def __init__(self, geometry):
        	QWidget.__init__(self)
		
		# Boite d'alignement vertical
		vbox=QVBoxLayout(self)
		
		#=== Création des répertoires temporaires ===#
		# Gestion du repertoire tmp avec EkdConfig
		self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "image_divers_renommage" + os.sep
		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)
		
		# Au cas où le répertoire existait déjà et qu'il n'était pas vide 
		# -> purge (simple précausion)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)
		
		#=== Drapeaux ===#
		# Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)

		# Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
		self.modifImageSource = 0

		#=== Variable de configuration ===#

		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()
		
		# Gestion de la configuration via EkdConfig

		# Paramètres de configuration
		self.config = EkdConfig
		# Identifiant du cadre
		self.idSection = "image_renommer"
		# Log du terminal
		self.base.printSection(self.idSection)
		# Fonction appelant la fenêtre principale
		self.mainWindowFrameGeometry = geometry

		self.listeImgSource = []
		
		# là où s'afficheront les infos
		self.zoneTexte = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneTexte.setText = self.zoneTexte.setPlainText
		self.zoneTexte.setReadOnly(True)
		
		self.tabwidget=QTabWidget()
		
		# Boîte de combo
		self.comboClassement=QComboBox()
		self.listeComboClassement=[(_(u'Par ordre de sélection'),  'ord_select'),\
					   (_(u'Par ordre alpha-numérique'),  'ord_apha_num'),\
				    	   (_(u'Par ordre de prise de vue (données Exif): ordre croissant'),  'ord_exif_oc'),\
					   (_(u'Par ordre de prise de vue (données Exif): ordre décroissant'),  'ord_exif_dc')]
		# Insertion de l'ordre de classement des images/photos dans la combo box
		for i in self.listeComboClassement:
                	self.comboClassement.addItem(i[0],QVariant(i[1]))
		self.connect(self.comboClassement, SIGNAL("currentIndexChanged(int)"), self.classement)
		
		#=== 1er onglet ===#
		self.framNbreImg=QFrame()
		vboxReglage=QVBoxLayout(self.framNbreImg)
		
		self.grid = QGridLayout()
		self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
		self.spin1=SpinSlider(1, 10000, 1, '', self)
		self.grid.addWidget(self.spin1, 0, 1)
		self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
		self.spin2=SpinSlider(3, 18, 6, '', self)
		self.grid.addWidget(self.spin2, 1, 1)
		self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		# Demandé par Marc de la liste lprod
		# "J'aurais été interressé par un paramètre supplémentaire pour définir l'incrément (ou le pas ...).
		# En fait cela permettrait d'insérer (donc classer) facilement les photos issues d'appareils 
		# différents mais traitant les mêmes sujets. En fait, je voudrais réaliser une série finale des 
		# photos prises avec mon APN, mon camescope et l'APN de mon épouse. Je numérote de 10 en 10 la 
		# plus grosse série de photos et viens insérer les autres au bon endroit sans avoir à utiliser 
		# des indices a, b, c, etc."
		self.grid.addWidget(QLabel(_(u"Valeur d'incrément (passage d'une image à l'autre)")), 2, 0)
		#self.spin3=SpinSlider(1, 1000, 1, 'increment', self) # Ne fonctionne pas
		self.spin3=SpinSlider(1, 1000, 1, '', self)
		self.grid.addWidget(self.spin3, 2, 1)
		self.connect(self.spin3, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Classement")), 3, 0)
		self.grid.addWidget(self.comboClassement, 3, 1)
		
		self.grid.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid)
		vboxReglage.addStretch()
		
		#=== 2ème onglet ===#
		# infos - logs
		self.zoneAffichInfosImg = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
		self.zoneAffichInfosImg.setReadOnly(True)
		self.framImg=QFrame()
		vboxReglage=QVBoxLayout(self.framImg)
		vboxReglage.addWidget(self.zoneAffichInfosImg)
		self.framImg.setEnabled(False)

		# Là où s'afficheront les images
		self.afficheurImgSource=SelectWidget(geometrie = self.mainWindowFrameGeometry)
		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = "image" # Défini le type de fichier source.
		self.typeSortie = "image" # Défini le type de fichier de sortie.
		self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source.

		self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source'))
		self.indexTabReglage=self.tabwidget.addTab(self.framNbreImg, _(u'Réglages'))
		self.indexTabInfo=self.tabwidget.addTab(self.framImg, _(u'Infos'))
		
		vbox.addWidget(self.tabwidget)
		
		# -------------------------------------------------------------------
		# widgets du bas : ligne + boutons Aide et Appliquer
		# -------------------------------------------------------------------
		
		# Boutons
		boutAidetRenomImg=QPushButton(_(u" Aide"))
		boutAidetRenomImg.setIcon(QIcon("Icones/icone_aide_128.png"))
		self.connect(boutAidetRenomImg, SIGNAL("clicked()"), self.afficherAide)
		self.boutApp=QPushButton(_(u" Renommer"))
		self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		
		self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer)
		
		# Ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons
		
		hbox=QHBoxLayout()
		hbox.addWidget(boutAidetRenomImg)
		hbox.addStretch()	# espace entre les 2 boutons
		hbox.addWidget(self.boutApp)
		self.boutApp.setEnabled(False)
		vbox.addLayout(hbox)
		
		# Affichage de la boîte principale
		self.setLayout(vbox)
		
		#----------------------------------------------------------------------------------------------------
		# Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
		#----------------------------------------------------------------------------------------------------
		
		self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
	def __init__(self, statusBar, geometry):
        	QWidget.__init__(self)

		# -------------------------------
		# Parametres généraux du widget
		# -------------------------------
		#=== tout sera mis dans une boîte verticale ===#
		vbox=QVBoxLayout(self)

		#=== Création des répertoires temporaires ===#
		# Utilisation de EkdConfig
		self.repTampon = EkdConfig.getTempDir() + os.sep

		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)

		# Au cas où le répertoire existait déjà et qu'il n'était pas vide
		# -> purge (simple précausion)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)

		#=== Drapeaux ===#
		# Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)

		# Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées?
		# Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image
		self.conversionImg = 0

		# Est-ce qu'une prévisualisation a été appelée?
		self.previsualImg = 0
		# Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
		self.modifImageSource = 0

		# Délai avant conversion
		self.timer = QTimer()
		self.connect(self.timer, SIGNAL('timeout()'), self.sonderTempsActuel)

		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()
		# Gestion de la configuration via EkdConfig
		# Paramètres de configuration
		self.config = EkdConfig
		# Identifiant du cadre
		self.idSection = "image_changer_format"
		# Log du terminal
		self.base.printSection(self.idSection)
		# Fonction appelant la fenêtre principale
		self.mainWindowFrameGeometry = geometry

		self.listeImgSource = []
		self.listeImgDestin = []

		#------------------------
		# Onglets et stacked
		#------------------------
		self.tabwidget=QTabWidget()

		#=== 1er onglet ===#
		self.framReglage=QFrame()
		vboxReglage=QVBoxLayout(self.framReglage)

		# boite de combo
		self.comboReglage=QComboBox()
		self.listeComboReglage=[(_(u'JPEG (.jpg)'), '.jpg'),\
					(_(u'JPEG (.jpeg)'), '.jpeg'),\
					(_(u'PNG (.png)'), '.png'),\
					(_(u'GIF (.gif)'), '.gif'),\
					(_(u'BMP (.bmp)'), '.bmp'),\
					(_(u'PPM (.ppm)'), '.ppm'),\
					(_(u'TIFF (.tiff)'), '.tiff'),\
					(_(u'TIF (.tif)'), '.tif')]

		# Se trouve directement dans l'onglet Réglages
		self.grid = QGridLayout()
		self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
		self.spin1=SpinSlider(1, 100000, 1, '', self)
		self.grid.addWidget(self.spin1, 0, 1)
		self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
		self.spin2=SpinSlider(3, 18, 6, '', self)
		self.grid.addWidget(self.spin2, 1, 1)
		self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)

		self.grid.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid)
		vboxReglage.addStretch()

		# Insertion des formats dans la combo box
		for i in self.listeComboReglage:
                	self.comboReglage.addItem(i[0],QVariant(i[1]))
		self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
		# Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
		self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'format')

		self.grid2 = QGridLayout()

		# Label qualité pour la qualité (compression) lors de la sauvegarde en JPEG
		self.labQualite=QLabel(_(u"Qualité"))
		self.labQualite.hide()

		self.grid2.addWidget(QLabel(_(u'Type de format après traitement')), 0, 0)
		self.grid2.addWidget(self.comboReglage, 0, 1)
		self.grid2.addWidget(self.labQualite, 2, 0)
		# Réglage de la qualité pour la qualité (compression) lors de la sauvegarde en JPEG
		self.spin3=SpinSlider(1, 100, 75, '', self)
		self.spin3.hide()

		i = self.comboReglage.currentIndex()
		idCombo=str(self.comboReglage.itemData(i).toStringList()[0])
		if idCombo in ['.jpg', '.jpeg']:
			self.labQualite.show()
			self.spin3.show()
		else:
			self.labQualite.hide()
			self.spin3.hide()

		self.grid2.addWidget(self.spin3, 2, 1)
		self.connect(self.spin3, SIGNAL("valueChanged(int)"), self.changeQualitePourJPEG)

		self.grid2.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid2)
		vboxReglage.addStretch()

		#=== 2ème onglet ===#
		# infos - logs
		self.zoneAffichInfosImg = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
		self.zoneAffichInfosImg.setReadOnly(True)
		self.framImg=QFrame()
		vboxReglage=QVBoxLayout(self.framImg)
		vboxReglage.addWidget(self.zoneAffichInfosImg)
		self.framImg.setEnabled(False)

		# -------------------------------------------------
		# Onglets d'affichage image source et destination
		# -------------------------------------------------

		# Là où s'afficheront les images
		self.afficheurImgSource=SelectWidget(geometrie = geometry)
 		self.afficheurImgDestination=Lecture_VisionImage(statusBar)

		self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source'))
		self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
		self.indexTabImgDestin=self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement'))
		self.indexTabInfo=self.tabwidget.addTab(self.framImg, _(u'Infos'))

		vbox.addWidget(self.tabwidget)
		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = "image" # Défini le type de fichier source.
		self.typeSortie = "image" # Défini le type de fichier de sortie.
		self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source.

		#------------------
		# Widgets du bas
		#------------------

		# boutons
		boutAide=QPushButton(_(u" Aide"))
		boutAide.setIcon(QIcon("Icones/icone_aide_128.png"))
		boutAide.setFocusPolicy(Qt.NoFocus)
		self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide)
		self.boutApPremImg = QPushButton(_(u" Voir le résultat"))
		self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png"))
		self.boutApPremImg.setFocusPolicy(Qt.NoFocus)
		self.boutApPremImg.setEnabled(False)
		self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_img)
		self.boutApp=QPushButton(_(u" Appliquer"))
		self.boutApp.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		self.boutApp.setFocusPolicy(Qt.NoFocus)
		self.boutApp.setEnabled(False)
		self.connect(self.boutApp, SIGNAL("clicked()"), self.appliquer0)

		# Ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons

		hbox=QHBoxLayout()
		hbox.addWidget(boutAide)
		hbox.addStretch()	# espace entre les 2 boutons
		hbox.addWidget(self.boutApPremImg)
		hbox.addStretch()
		hbox.addWidget(self.boutApp)
		vbox.addLayout(hbox)

		self.setLayout(vbox)

		#------------------------------------------------
		# Barre de progression dans une fenêtre séparée
		#------------------------------------------------

		self.progress=QProgressDialog(_(u"Progression ..."), _(u"Arrêter le processus"), 0, 100)
		self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression'))
		# Attribution des nouvelles dimensions
		self.progress.setMinimumWidth(500)
		self.progress.setMinimumHeight(100)

		self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab)

		#----------------------------------------------------------------------------------------------------
		# Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
		#----------------------------------------------------------------------------------------------------

		self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)

		#----------------------------------------------------------------------------------------------------
		# Signal pour afficher ou ne pas afficher les widgets de changement de qualité pour les images
		#----------------------------------------------------------------------------------------------------

		self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerQualJPEG)
	def __init__(self):

		#=== Identifiant de la classe ===#
		self.idSection = "animation_encodage_general"
		
		# ------------------------------------------------------------------- #
		# Chemin des répertoires temporaires pour la gestion des fichiers
		# mod (extension .mod). Ce sont (apparemment) des fichiers mpeg avec
		# une extension .mod. Les fichiers en question ont juste besoin
		# d'être renommés avec une extension .mpg avant le traitement.
		# ------------------------------------------------------------------- #
		self.repTempEntree = EkdConfig.getTempDir() + os.sep
		# création des répertoires temporaires
		if os.path.isdir(self.repTempEntree) is False: os.makedirs(self.repTempEntree)	
        	# Chemin exact d'écriture pour le tampon des fichiers mod
        	self.repTempFichiersMod = self.repTempEntree+'transcodage'+os.sep+'fichiers_mod'+os.sep
		# Création du chemin
		if os.path.isdir(self.repTempFichiersMod) is False: os.makedirs(self.repTempFichiersMod)
		# Epuration/elimination des fichiers tampon contenus dans le rep tampon
		for toutRepTemp in glob.glob(self.repTempFichiersMod+'*.*'): os.remove(toutRepTemp)

		# -------------------------------------------------------------------
		# Widgets intégrés à la boîte de groupe "Réglage de sortie de l'encodage".
		# La boîte de combo définie ci-dessus 'sélectionne' ceux qui vont s'afficher
		# -> utilisation d'un stacked
		# -------------------------------------------------------------------

		# === Widgets associés au codecs: Copie (format original) - AVI-RAW Sans
		# Compression - Codec XVID - Qualite SVCD - Qualite DVD - Codec H264 MPEG 4

		# création de stacked pour les QWidget
		self.stacked=QStackedWidget()
		self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed))

		self.itemStacked_sansReglages=Codecs_SansReglages()
		# par défaut
		self.indexStacked_sansReglages=self.stacked.addWidget(self.itemStacked_sansReglages)
		
		# === Widgets associés aux codecs qui possèdent des réglages (itemStacked)
		self.itemStacked_AVI_RAW=Codecs_AvecReglages('avirawsanscompression', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_HFYU=Codecs_AvecReglages('avirawsanscompression', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_DIVX4=Codecs_AvecReglages('codecdivx4', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_XVID=Codecs_AvecReglages('codecxvid', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_JPEG=Codecs_AvecReglages('codecmotionjpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_MPEG1=Codecs_AvecReglages('codecmpeg1', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_MPEG2=Codecs_AvecReglages('codecmpeg2', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_WMV2=Codecs_AvecReglages('codecwmv2', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_VOB=Codecs_AvecReglages('codec_vob_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_flash=Codecs_AvecReglages('macromediaflashvideo', min_range_1=1 , max_range_1=100, min_range_2=10, max_range_2=5000, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_oggTheora=Codecs_AvecReglages('codecoggtheora', min_range_1=0 , max_range_1=10, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_mpeg4_h264=Codecs_AvecReglages('codech264mpeg4', min_range_1=800 , max_range_1=2800, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_mpeg4_h264_ext_h264=Codecs_AvecReglages('codech264mpeg4_ext_h264', min_range_1=800 , max_range_1=2800, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_3GP=Codecs_AvecReglages('codec_3GP_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_AMV=Codecs_AvecReglages('codec_AMV_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		self.itemStacked_MOV=Codecs_AvecReglages('codec_mov_ffmpeg', min_range_1=1, max_range_1=100, min_range_2=800, max_range_2=2800, txt1=_(u"Réglage de la compression : "), txt5=_(u"Réglage du bitrate vidéo : "))
		
		# === Widgets associés aux codecs qui possèdent des réglages (indexStacked)
		self.indexStacked_AVI_RAW=self.stacked.addWidget(self.itemStacked_AVI_RAW)
		self.indexStacked_HFYU=self.stacked.addWidget(self.itemStacked_HFYU)
		self.indexStacked_DIVX4=self.stacked.addWidget(self.itemStacked_DIVX4)
		self.indexStacked_XVID=self.stacked.addWidget(self.itemStacked_XVID)
		self.indexStacked_JPEG=self.stacked.addWidget(self.itemStacked_JPEG)
		self.indexStacked_MPEG1=self.stacked.addWidget(self.itemStacked_MPEG1)
		self.indexStacked_MPEG2=self.stacked.addWidget(self.itemStacked_MPEG2)
		self.indexStacked_WMV2=self.stacked.addWidget(self.itemStacked_WMV2)
		self.indexStacked_VOB=self.stacked.addWidget(self.itemStacked_VOB)
		self.indexStacked_flash=self.stacked.addWidget(self.itemStacked_flash)
		self.indexStacked_oggTheora=self.stacked.addWidget(self.itemStacked_oggTheora)
		self.indexStacked_mpeg4_h264=self.stacked.addWidget(self.itemStacked_mpeg4_h264)
		self.indexStacked_mpeg4_h264_ext_h264=self.stacked.addWidget(self.itemStacked_mpeg4_h264_ext_h264)
		self.indexStacked_3GP=self.stacked.addWidget(self.itemStacked_3GP)
		self.indexStacked_AMV=self.stacked.addWidget(self.itemStacked_AMV)
		self.indexStacked_MOV=self.stacked.addWidget(self.itemStacked_MOV)

		#----------------------------------------------------------------------------------
		# Paramètres de la liste de combo: [(identifiant, nom entrée, index du stacked,
		# 	instance stacked, extension fichier sortie, valeur spin à récupérer?),...]
		#----------------------------------------------------------------------------------
		self.listeCombo =	[\
		('copie',		_(u'Copie (format original)'),		self.indexStacked_sansReglages,\
			self.itemStacked_sansReglages,	'',		0),\
		('avirawsanscompression',_(u'AVI-RAW i420 (sans compression) (.avi)'),	self.indexStacked_AVI_RAW,\
			self.itemStacked_AVI_RAW,	'.avi',		1),\
		('codec_dv_ffmpeg',_(u'Codec DV (.dv)'),	self.indexStacked_sansReglages,\
			self.itemStacked_sansReglages,	'.dv',		0),\
		('codec_mov_ffmpeg',_(u'Codec QuickTime MOV (.mov)'),	self.indexStacked_MOV,\
			self.itemStacked_MOV,	        '.mov',		1),\
		('codec_hfyu_ffmpeg',_(u'Codec HFYU: Huffman Lossless YUV (yuv422p) (.avi)'), self.indexStacked_HFYU,\
			self.itemStacked_HFYU,	        '.avi',		1),\
		('codecmotionjpeg',	_(u'Codec Motion JPEG (.avi)'),		self.indexStacked_JPEG,\
			self.itemStacked_JPEG,		'.avi',		1),\
		('codecoggtheora',	_(u'Codec OGG THEORA (.ogg)'),		self.indexStacked_oggTheora,\
			self.itemStacked_oggTheora,	'.ogg',		1),\
		('codec_vob_ffmpeg',_(u'Codec VOB (DVD-Video stream MPEG-2) (.vob)'),	self.indexStacked_VOB,\
			self.itemStacked_VOB,	'.vob',		1),\
		('codecmpeg2',		_(u'Codec MPEG 2 (.mpg)'),		self.indexStacked_MPEG2,\
			self.itemStacked_MPEG2,		'.mpg',		1),\
		('codech264mpeg4',	_(u'Codec H264 MPEG 4 (.mp4)'),		self.indexStacked_mpeg4_h264,\
			self.itemStacked_mpeg4_h264,	'.mp4',		1),\
		('codech264mpeg4_ext_h264', _(u'Codec H264 MPEG 4 (.h264)'),	self.indexStacked_mpeg4_h264_ext_h264,\
			self.itemStacked_mpeg4_h264_ext_h264,	'.h264',	1),\
		('codecxvid',		_(u'Codec XVID (.avi)'),		self.indexStacked_XVID,\
			self.itemStacked_XVID,	  '.avi',		1),\
		('codecdivx4',		_(u'Codec DIVX4 (.avi)'),		self.indexStacked_DIVX4,\
			self.itemStacked_DIVX4,		'.avi',		1),\
		('codecmpeg1',		_(u'Codec MPEG 1 (.mpg)'),		self.indexStacked_MPEG1,\
			self.itemStacked_MPEG1,		'.mpg',		1),\
		('macromediaflashvideo',_(u'Macromedia Flash Video (.flv)'),	self.indexStacked_flash,\
			self.itemStacked_flash,		'.flv',		1),\
		('codecwmv2',		_(u'Codec WMV2 (.wmv)'),		self.indexStacked_WMV2,\
			self.itemStacked_WMV2,		'.wmv',		1),\
		('codec_3GP_ffmpeg',_(u'Codec 3GP (3rd Generation Partnership Project) (.3gp)'), self.indexStacked_3GP,\
			self.itemStacked_3GP,	'.3gp',		1),\
		('codec_AMV_ffmpeg',		_(u'Codec AMV: pour lecteurs mp4 (.avi)'),  self.indexStacked_AMV,\
			self.itemStacked_AMV,		'.avi',		1),\
					]
		
		#---------------------------
		# Dérivation de la classe
		#---------------------------
		super(Animation_Encodage_General, self).__init__(_(u"Transcodage: Général"))
Exemple #11
0
	def __init__(self, statusBar, geometry):
        	QWidget.__init__(self)
		
		# ----------------------------
		# Quelques paramètres de base
		# ----------------------------

		# Paramètres de configuration
		self.config = EkdConfig
		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()
		self.idSection = "image_image_composite"
		# Log du terminal
		self.base.printSection(self.idSection)
		# Fonction appelant la fenêtre principale
		self.mainWindowFrameGeometry = geometry

		# Création des répertoires temporaires. Utilisation de EkdConfig
		self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "temp_duplication" + os.sep
		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)
			
		# Au cas où le répertoire existait déjà et qu'il n'était pas vide 
		# -> purge (simple précausion)
		for toutRepCompo in glob.glob(self.repTampon+'*.*'):
			os.remove(toutRepCompo)
			
		# Répertoire tampon dans lequel est crée le compositing qui sera crée par le
		# bouton 'Voir le résultat'. Utilisation de EkdConfig
		self.repTamponVisuVoirRes = self.repTampon + "visu_voir_res_compo" + os.sep
		if os.path.isdir(self.repTamponVisuVoirRes) is False:
        		os.makedirs(self.repTamponVisuVoirRes)
		
		# Au cas où le répertoire existait déjà et qu'il n'était pas vide 
		# -> purge (simple précausion)
		for toutRepCompoVisu in glob.glob(self.repTamponVisuVoirRes+'*.*'):
			os.remove(toutRepCompoVisu)
		
		# Répertoire temporaire 1 pour les redimensionnement des images
		if os.path.isdir(self.repTampon+'redim_1/') is False:
        		os.makedirs(self.repTampon+'redim_1/')
		# Répertoire temporaire 2 pour les redimensionnement des images	
		if os.path.isdir(self.repTampon+'redim_2/') is False:
        		os.makedirs(self.repTampon+'redim_2/')
			
		# Au cas où le répertoire existait déjà et qu'il n'était pas vide 
		# -> purge (simple précausion)
		for toutRepCompoRedim in glob.glob(self.repTampon+'redim_1/'+'*.*'):
			if len(toutRepCompoRedim)>0:
				os.remove(toutRepCompoRedim)
		# ...
		for toutRepCompoRedim in glob.glob(self.repTampon+'redim_2/'+'*.*'):
			if len(toutRepCompoRedim)>0:
				os.remove(toutRepCompoRedim)
		
		#=== Drapeaux ===#
		# Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)
		
		# Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées?
		# Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image
		self.conversionImg = 0
		
		# Est-ce qu'une prévisualisation a été appelée?
		self.previsualImg = 0
		# Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
		self.modifImageSource = 0

		# Liste de chemins de fichiers avec et sans canal alpha et du dossier de sauvegarde
		self.listeChemAVcanAlph=[]
		self.listeChemSANScanAlph=[]
		self.listeImgDestin = []
		
		# Boite d'alignement vertical
		vbox=QVBoxLayout(self)
		
		# --------------------------------------------------
		# widgets du haut : titre + bouton de sélection
		# --------------------------------------------------
		
		hbox = QHBoxLayout()
		
		# Ajout du titre de la page et de l'aperçu à la boite verticale
		vbox.addLayout(hbox, 0)
		
		#=== Bouton de sélection des images alpha et sans alpha ===#
		hbox = QHBoxLayout()

		self.framReglage=QFrame()
		vboxReglage=QVBoxLayout(self.framReglage)

		# Pour la gestion du nombre d'images à traiter ##############
		self.grid = QGridLayout()
		self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
		self.spin1=SpinSlider(1, 100000, 1, '', self)
		self.grid.addWidget(self.spin1, 0, 1)
		self.connect(self.spin1, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
		self.spin2=SpinSlider(3, 18, 6, '', self)
		self.grid.addWidget(self.spin2, 1, 1)
		self.connect(self.spin2, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		
		self.grid.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid)
		vboxReglage.addStretch()

		# -------------------------------------------------
		# Onglets d'affichage image source et destination
		# -------------------------------------------------
		
		# On peut sélectionner les extensions qui doivent être visibles comme ceci:
		#self.afficheurImgSource=SelectWidget(extensions=["*.jpg", "*.png"], geometrie = self.mainWindowFrameGeometry)
		# Là uniquement les fichiers png et gif apparaissent ds la fenêtre de chargement
		# Ne pas oublier de mettre * avant le point et l'extension

		# Là où s'afficheront les images
		# Avec canal alpha
		self.afficheurImgSourceAvecCanalAlpha=SelectWidget(extensions=["*.png", "*.gif"], geometrie = self.mainWindowFrameGeometry)
		# Sans canal alpha
		self.afficheurImgSourceSansCanalAlpha=SelectWidget(geometrie = self.mainWindowFrameGeometry)

		# Gestion de la configuration via EkdConfig
		# Résultat du compositing
		self.afficheurImgDestination=Lecture_VisionImage(statusBar)
		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = "image" # Défini le type de fichier source.
		self.typeSortie = "image" # Défini le type de fichier de sortie.
		self.sourceEntrees = self.afficheurImgSourceSansCanalAlpha # Fait le lien avec le sélecteur de fichier source.
		### Remarque : Le choix a été fait de ne pas mettre la boîte de sélection des images alpha dans le tampon.
		
		# infos - logs
		self.zoneAffichInfosImg = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
		self.zoneAffichInfosImg.setReadOnly(True)
		self.fram=QFrame()
		vboxInfIm=QVBoxLayout(self.fram)
		vboxInfIm.addWidget(self.zoneAffichInfosImg)
		self.fram.setEnabled(False)
		
		self.tabwidget=QTabWidget()
		
		self.indexTabImgSourceAvCanAlph = self.tabwidget.addTab(self.afficheurImgSourceAvecCanalAlpha, _(u'Image(s) avec canal alpha'))
		self.indexTabImgSourceSansCanAlph = self.tabwidget.addTab(self.afficheurImgSourceSansCanalAlpha, _(u'Image(s) sans canal alpha'))
		self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
		self.indexTabImgDestin=self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement'))
		self.indexTabInfo=self.tabwidget.addTab(self.fram, _(u'Infos'))
		
		vbox.addWidget(self.tabwidget)
		
		# -------------------------------------------------------------------
		# widgets du bas : ligne + boutons
		# -------------------------------------------------------------------
		
		# boutons
		boutAide=QPushButton(_(u" Aide"))
		boutAide.setIcon(QIcon("Icones/icone_aide_128.png"))
		self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide)
		self.boutApPremImg = QPushButton(_(u" Voir le résultat"))
		self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png"))
		self.boutApPremImg.setFocusPolicy(Qt.NoFocus)
		self.boutApPremImg.setEnabled(False)
		self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_derniere_img)
		self.boutAppliquer=QPushButton(_(u" Appliquer et sauver"))
		self.boutAppliquer.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		self.boutAppliquer.setEnabled(False)
		self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer)
		
		# ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons
		
		hbox=QHBoxLayout()
		hbox.addWidget(boutAide)
		hbox.addStretch()	# espace entre les 2 boutons
		hbox.addWidget(self.boutApPremImg)
		hbox.addStretch()
		hbox.addWidget(self.boutAppliquer)
		vbox.addLayout(hbox)
		
		# affichage de la boîte principale
		self.setLayout(vbox)
		
		self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab)
		
		#----------------------------------------------------------------------------------------------------
		# Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
		#----------------------------------------------------------------------------------------------------
		
		self.connect(self.afficheurImgSourceSansCanalAlpha, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
	def __init__(self, statusBar, geometry):

        	QWidget.__init__(self)
		
		# ----------------------------
		# Quelques paramètres de base
		# ----------------------------
		
		#=== Création des répertoires temporaires ===#
		# Gestion du repertoire tmp avec EkdConfig 
		self.repTampon = EkdConfig.getTempDir() + os.sep + "tampon" + os.sep + "image_divers_redimensionner" + os.sep


		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)
		if os.path.isdir(self.repTampon+'redim'+os.sep) is False:
        		os.makedirs(self.repTampon+'redim'+os.sep)	
		# Si le répertoire /tmp/ekd/tampon/image_divers_redimensionner/redim
		# n'est pas vide, il est expressément vidé de tout son contenu
		tempr=glob.glob(self.repTampon+'redim'+os.sep+'*.*')
		if len(tempr)>0:
			for parc in tempr: os.remove(parc)
		
		#=== Variable contenant les titres du log ===#
		self.infosImgTitre = []
		txt = _(u"Image(s) chargée(s)")
		a='#'*36
		b = a + '\n# ' + txt + '\n' + a + '\n'
		txt=_(u"Image(s) convertie(s)")
		c = a + '\n# ' + txt + '\n' + a + '\n'
		self.infosImgTitre.append(b)
		self.infosImgTitre.append(c)
		
		#=== Drapeaux ===#
		# Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)
		
		# Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées?
		# Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image
		self.conversionImg = 0
		
		# Est-ce qu'une prévisualisation a été appelée?
		self.previsualImg = 0
		# Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
		self.modifImageSource = 0
		
		# Identifiant des filtres utilisant partiellement ou intégralement un module python durant 
		# la conversion
		self.filtresPython=['redim_avec_ratio', 'redim_sans_ratio']
		
		self.timer = QTimer()
		self.connect(self.timer, SIGNAL('timeout()'), self.sonderTempsActuel)
		
		self.process = QProcess()
		self.connect(self.process, SIGNAL('finished(int)'), self.finConversion)
		
		# Fonctions communes à plusieurs cadres du module Image
		self.base = Base()

		# Gestion de la configuration via EkdConfig

		# Paramètres de configuration
		self.config = EkdConfig
		# Identifiant du cadre
		self.idSection = "image_redimensionner"
		# Log du terminal
		self.base.printSection(self.idSection)
		# Fonction appelant la fenêtre principale
		self.mainWindowFrameGeometry = geometry

		self.listeImgSource = []
		self.listeImgDestin = []
		
		# Boite d'alignement vertical
		vbox=QVBoxLayout(self)
		
		# ----------------------------------------
		# Bouton de sélection des images sources
		# ----------------------------------------
		
		self.tabwidget=QTabWidget()
		# Rq: le signal est placé à la fin de __init__ à cause d'une bizarrerie sous qt4.4
		
		#------------------
		# Onglet Réglages
		#------------------
		
		self.framReglage=QFrame()
		vboxReglage=QVBoxLayout(self.framReglage)
		
		# Gestion du nombre d'images à traiter
		self.grid = QGridLayout()
		self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
		self.spin1_ImTrait=SpinSlider(1, 100000, 1, '', self)
		self.grid.addWidget(self.spin1_ImTrait, 0, 1)
		self.connect(self.spin1_ImTrait, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
		self.spin2_ImTrait=SpinSlider(3, 18, 6, '', self)
		self.grid.addWidget(self.spin2_ImTrait, 1, 1)
		self.connect(self.spin2_ImTrait, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		
		self.grid.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid)
		vboxReglage.addStretch()
		
		#=== Stacked ===#
		
		self.stacked = QStackedWidget()
		self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed))
		
		#=== Instanciation des widgets du stacked  ===#
		
		# Widgets du stacked avec une seule boite de spin
		self.stacked_redim_avec_ratio = SpinSliders(self, 10,6000,640, _(u"nouvelle largeur"), 'largeur_ratio')
		
		# Widgets du stacked avec 2 boites de spin
		self.stacked_redim_sans_ratio = SpinSliders(self, 10,6000,640,_(u"nouvelle largeur"),'largeur_sans_ratio',
					10,6000,480, _(u"nouvelle hauteur"), 'longueur_sans_ratio')
		
		# Ajout des widgets aux stacked
		indexStacked_redim_avec_ratio = self.stacked.addWidget(self.stacked_redim_avec_ratio)
		indexStacked_redim_sans_ratio = self.stacked.addWidget(self.stacked_redim_sans_ratio)
		
		#=== Autres widgets de l'onglet réglagle ===#
		
		#---- boite de combo
		self.comboReglage=QComboBox()
		# Paramètres de la liste de combo: [(nom entrée, identifiant, index du stacked,
		# instance stacked),...]
		self.listeComboReglage=[\
			(_(u'Redimensionner en tenant compte des proportions'), 'redim_avec_ratio',
				indexStacked_redim_avec_ratio, self.stacked_redim_avec_ratio),
			(_(u'Redimensionner sans tenir compte des proportions'), 'redim_sans_ratio',
				indexStacked_redim_sans_ratio, self.stacked_redim_sans_ratio)]
		
		# Insertion des codecs de compression dans la boite de combo
		for i in self.listeComboReglage:
                	self.comboReglage.addItem(i[0], QVariant(i[1]))
		self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
		# Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
		self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'methode')
		self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"),
				self.changerApercu)
		
		#---- Pseudo-aperçu de la redimension
		self.apercu = Apercu((400, 300), statusBar)
		
		self.connect(self.stacked_redim_avec_ratio.spin, SIGNAL("valueChanged(int)"),
				self.changerApercu)
		self.connect(self.stacked_redim_sans_ratio.spin1, SIGNAL("valueChanged(int)"),
				self.changerApercu)
		self.connect(self.stacked_redim_sans_ratio.spin2, SIGNAL("valueChanged(int)"),
				self.changerApercu)
		# On donne les valeurs de largeur et hauteur des images converties à l'aperçu
		self.changerApercu()
		
		# Légende de l'aperçu
		coulSource, coulConvert = self.apercu.couleurContourSourceConvert()
		self.legendeSource = ElementLegende(": " +\
			_(u"Contours des images sources (taille la plus fréquente en foncé)"), coulSource)
		self.legendeConvert = ElementLegende(": "+ _(u"Contours des images à convertir"), coulConvert)
		self.legendeSource.hide()
		self.legendeConvert.hide()
		
		#=== Mise-en-page ===#
		
		hbox = QHBoxLayout()
		hbox.addWidget(QLabel(_(u'Type')))
		hbox.addWidget(self.comboReglage)
		hbox.setAlignment(Qt.AlignHCenter)
		
		vboxReglage.addLayout(hbox)
		vboxReglage.addWidget(self.stacked)
		hboxApercu = QHBoxLayout()
		hboxApercu.addStretch()
		hboxApercu.addWidget(self.apercu)
		hboxApercu.addStretch()
		vboxReglage.addLayout(hboxApercu)
		vboxReglage.addWidget(self.legendeSource)
		vboxReglage.addWidget(self.legendeConvert)
		vboxReglage.addStretch()
		
		#----------------
		# Onglet de log
		#----------------
		
		self.zoneAffichInfosImg = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
		self.zoneAffichInfosImg.setReadOnly(True)
		self.framInfos=QFrame()
		vboxInfIm=QVBoxLayout(self.framInfos)
		vboxInfIm.addWidget(self.zoneAffichInfosImg)

		# -------------------------------------------------
		# Onglets d'affichage image source et destination
		# -------------------------------------------------

		# Là où s'afficheront les images
		self.afficheurImgSource=SelectWidget(geometrie = self.mainWindowFrameGeometry)
		
		# Gestion de la configuration via EkdConfig
		self.afficheurImgDestination=Lecture_VisionImage(statusBar)
		## ---------------------------------------------------------------------
		# Variables pour la fonction tampon
		## ---------------------------------------------------------------------
		self.typeEntree = "image" # Défini le type de fichier source.
		self.typeSortie = "image" # Défini le type de fichier de sortie.
		self.sourceEntrees = self.afficheurImgSource # Fait le lien avec le sélecteur de fichier source.
		
		vbox.addWidget(self.tabwidget)

		self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source'))
		self.indexTabReglage=self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
		self.indexTabImgDestin = self.tabwidget.addTab(self.afficheurImgDestination, _(u'Image(s) après traitement'))
		self.indexTabInfo=self.tabwidget.addTab(self.framInfos, _(u'Infos'))
		
		# -------------------------------------------
		# widgets du bas : curseur + ligne + boutons
		# -------------------------------------------
		
		# Boutons
		boutAide=QPushButton(_(u" Aide"))
		boutAide.setIcon(QIcon("Icones/icone_aide_128.png"))
		self.connect(boutAide, SIGNAL("clicked()"), self.afficherAide)
		self.boutApPremImg = QPushButton(_(u" Voir le résultat"))
		self.boutApPremImg.setIcon(QIcon("Icones/icone_visionner_128.png"))
		self.boutApPremImg.setFocusPolicy(Qt.NoFocus)
		# Bouton inactif au départ
		self.boutApPremImg.setEnabled(False)
		self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_derniere_img)
		self.boutAppliquer=QPushButton(_(u" Appliquer et sauver"))
		self.boutAppliquer.setIcon(QIcon("Icones/icone_appliquer_128.png"))
		# Bouton inactif au départ
		self.boutAppliquer.setEnabled(False)
		self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer0)
		
		# Ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons
		
		hbox=QHBoxLayout()
		hbox.addWidget(boutAide)
		hbox.addStretch()
		hbox.addWidget(self.boutApPremImg)
		hbox.addStretch()
		hbox.addWidget(self.boutAppliquer)
		vbox.addLayout(hbox)
		
		#-----------------------------
		# Barre de progression
		#-----------------------------
		
		self.progress=QProgressDialog(_(u"Conversion en cours..."), _(u"Arrêter"), 0, 100)
		self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression'))
		self.progress.setMinimumWidth(500)
		self.progress.setMinimumHeight(100)
		self.connect(self.progress, SIGNAL("canceled()"), self.arretProgression)
		
		# affichage de la boîte principale
		self.setLayout(vbox)

		self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab)

		#----------------------------------------------------------------------------------------------------
		# Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
		#----------------------------------------------------------------------------------------------------
		
		self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifImgSource)