def appliquer(self, nomSortie=None, ouvert=1): """ appelle la boite de dialogue de sélection de fichier à sauver et appel de la fonction de changement du nombre d'images par seconde """ #=== Détermination des chemins d'entrée et sortie ===# chemin=unicode(self.getFile()) if not nomSortie: # suffix du fichier actif suffix=os.path.splitext(chemin)[1] saveDialog = EkdSaveDialog(self, mode="video", suffix=suffix, title=_(u"Sauver")) cheminFichierEnregistrerVideo = saveDialog.getFile() else: # module séquentiel cheminFichierEnregistrerVideo = nomSortie if not cheminFichierEnregistrerVideo: return ################################################################################### nbrImgSec = str(self.spin.value()) try: #### le changement de framerate est maintenant géré par FFmpeg ##### ffmpeg = WidgetFFmpeg('idx', chemin, cheminFichierEnregistrerVideo, valeurNum=nbrImgSec, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Réglage divers")) ffmpeg.exec_() ########################################################################################### except: messageErrAnEnc=QMessageBox(self) messageErrAnEnc.setText(_(u"Problème lors du changement du nombre d'images par seconde (mencoder)")) messageErrAnEnc.setWindowTitle(_(u"Erreur")) messageErrAnEnc.setIcon(QMessageBox.Warning) messageErrAnEnc.exec_() return self.lstFichiersSortie = cheminFichierEnregistrerVideo # chemin de la vidéo convertie pour le 2ème mplayer self.radioSource.setEnabled(True) self.radioConvert.setEnabled(True) self.radioSource.setChecked(False) self.radioConvert.setChecked(True) self.boutCompare.setEnabled(True) self.infoLog(None, chemin, None, cheminFichierEnregistrerVideo) return self.lstFichiersSortie # module séquentiel
def extraireAudio(self, cheminVideoEntre, SortieAudioSFA, laisserOuvert=1): """extraction de l'audio du fichier""" ffmpeg = WidgetFFmpeg("extractionaudio", cheminVideoEntre, SortieAudioSFA, laisserOuvert=laisserOuvert) ffmpeg.setWindowTitle(_(u"Extraction audio")) ffmpeg.exec_()
def appliquer(self, nomSortie=None, ouvert=1): """Fusion de vidéos""" #=== Récupération de la liste de fichiers ===# chemin=unicode(self.getFile()) if not nomSortie: # suffix du fichier actif suffix=os.path.splitext(chemin)[1] # suffix du codec actif saveDialog = EkdSaveDialog(self, mode="video", suffix=suffix, title=_(u"Sauver")) cheminFichierEnregistrerVideo = saveDialog.getFile() else: # module séquentiel cheminFichierEnregistrerVideo = nomSortie if not cheminFichierEnregistrerVideo: return ##################################################################################################### from moteur_modules_animation.mplayer import getVideoSize (videoLargeur, videoHauteur) = getVideoSize(chemin) #print videoLargeur, videoHauteur EkdPrint(u"%s %s" % (videoLargeur, videoHauteur)) # --------------------------------------------------------------------------------------------- ##################################################################################################### #######Détection/redimensionnement de la taille de la vidéo ################# # --> Car FFmpeg ne peut traitre que des vidéo de résolution paire #videoLargeur = float(videoLargeur) videoHauteur = float(videoLargeur) / float(self.idCombo) # Changement fait le 25/03/11 videoLargeur = int(videoLargeur) videoHauteur = int(videoHauteur) # Changement fait le 25/03/11 # Si dimension largeur impaire if int(videoLargeur) % 2 == 1 and int(videoHauteur) % 2 == 0: videoLargeur = videoLargeur - 1 videoHauteur = videoHauteur tailleVideo = [str(videoLargeur), str(videoHauteur)] #print tailleVideo, type(tailleVideo) EkdPrint(u"%s %s" % (tailleVideo, type(tailleVideo))) # Si dimension hauteur impaire if int(videoHauteur) % 2 == 1 and int(videoLargeur) % 2 == 0: videoLargeur = videoLargeur videoHauteur = videoHauteur - 1 tailleVideo = [str(videoLargeur), str(videoHauteur)] #print tailleVideo, type(tailleVideo) EkdPrint(u"%s %s" % (tailleVideo, type(tailleVideo))) # Si les deux dimensions (largeur et hauteur) sont impaires if int(videoLargeur) % 2 == 1 and int(videoHauteur) % 2 == 1: videoLargeur = videoLargeur - 1 videoHauteur = videoHauteur - 1 tailleVideo = [str(videoLargeur), str(videoHauteur)] #print tailleVideo, type(tailleVideo) EkdPrint(u"%s %s" % (tailleVideo, type(tailleVideo))) # Si les deux dimensions sont paires if int(videoLargeur) % 2 == 0 and int(videoHauteur) % 2 == 0: videoLargeur = videoLargeur videoHauteur = videoHauteur tailleVideo = [str(videoLargeur), str(videoHauteur)] #print tailleVideo, type(tailleVideo) EkdPrint(u"%s %s" % (tailleVideo, type(tailleVideo))) #print 'self.idCombo', self.idCombo EkdPrint(u'self.idCombo %s' % self.idCombo) ##################################################################################################### try: ffmpeg = WidgetFFmpeg('conv_en_16_9_ou_4_3', chemin, cheminFichierEnregistrerVideo, self.idCombo, laisserOuvert=ouvert, tailleVideo=tailleVideo) ffmpeg.setWindowTitle(_(u"Conversion de vidéos en 16/9 ou 4/3")) ffmpeg.exec_() ############################################################################################# except None: messageErrAnEnc=QMessageBox(self) messageErrAnEnc.setText(_(u"Problème lors de la conversion (FFmpeg)")) messageErrAnEnc.setWindowTitle(_(u"Erreur")) messageErrAnEnc.setIcon(QMessageBox.Warning) messageErrAnEnc.exec_() return self.lstFichiersSortie = cheminFichierEnregistrerVideo # pour la boite de dialogue de comparaison self.radioConvert.setChecked(True) self.radioSource.setEnabled(True) self.radioSource.setChecked(False) self.radioConvert.setEnabled(True) self.boutCompare.setEnabled(True) ######################################### ### Information à l'utilisateur self.infoLog(None, chemin, None, cheminFichierEnregistrerVideo) return self.lstFichiersSortie # module séquentiel
def appliquer(self, nomSortie=None, ouvert=1): """appel du moteur de ekd -> encodage""" if not nomSortie: index=self.combo.currentIndex() chemin = unicode(self.getFile()) # suffix du codec actif suffix=self.listeCombo[index][4] if suffix=='': suffix=os.path.splitext(chemin)[1] ext_chargee = os.path.splitext(chemin)[1] codec_reglage = self.listeCombo[index][1] # ------------------------------------------------------------------- # # 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. # ------------------------------------------------------------------- # nom_fich_sans_ext = os.path.splitext(os.path.basename(chemin))[0] if ext_chargee in ['.mod', '.MOD']: # Copie du fichier concerné dans le rep tampon et renommage avec ext .mpg shutil.copy(chemin, self.repTempFichiersMod+nom_fich_sans_ext + '.mpg') chemin = unicode(self.repTempFichiersMod + nom_fich_sans_ext + '.mpg') saveDialog = EkdSaveDialog(self, mode="video", suffix=suffix, title=_(u"Sauver")) cheminFichierEnregistrerVideo = saveDialog.getFile() else: # module séquentiel chemin=cheminFichierEnregistrerVideo=nomSortie if not cheminFichierEnregistrerVideo: return # quel est l'index du dernier item sélectionné de la boîte de combo? i=self.combo.currentIndex() # identifiant du codec actif idCodec=str(self.combo.itemData(i).toStringList()[0]) # méthode de QVariant # pas de spin pour Copie (format original) - AVI-RAW Sans Compression # Codec XVID - Qualite SVCD - Qualite DVD - Codec H264 MPEG 4 spin=None # par défaut for j in self.listeCombo: # attribution de la valeur du spin s'il existe if j[0]==idCodec and j[5]==1: if j[0] in ['codecmotionjpeg', 'codecmpeg2', 'codech264mpeg4', 'codech264mpeg4_ext_h264', 'codecdivx4', 'codecmpeg1', 'macromediaflashvideo', 'codecwmv2']: # La valeur de compression vidéo va de 31 à 1 (31 --> mauvaise qualité # jusqu'à à 1 --> très bonne qualité). Ici on va calculer en mettant # en place un réglage qui partira de 1 à 100 (1 --> mauvaise qualité # et 100 --> très bonne qualité) calculValComp = (31 * j[3].spinCompression.value()) / 100 # Il faut soustraire le résultat à 31 pour # avoir une valeur reconnue par Mencoder calculValComp = 31 - calculValComp # Si la la valeur de réglage de la compression est réglée sur # 100, la valeur retournée sera 0 (ce qui va générer une erreur # dans Mencoder ... et ainsi stopper le process), la valeur # retournée sera donc de 1 (ce qui sera ok) if j[3].spinCompression.value() == 100: calculValComp = 1 # Dimension de la vidéo (preset). Exception pour contrôler # les cas où l'utilisateur laisse par défaut: # Pas de changement (vidéo avec la même taille que l'original) try: valeurSizeGeneral = str(j[3].idComboGeneral) except: valeurSizeGeneral = '' # La valeur est sous forme de tuple et contient au moins 3 valeurs spin = (str(j[3].spinBitrateVideo.value()), str(calculValComp), str(valeurSizeGeneral)) elif j[0] in ['codec_vob_ffmpeg']: # La valeur de compression vidéo va de 255 à 1 (255 --> mauvaise qualité # jusqu'à 1 --> très bonne qualité). Ici on va calculer en mettant # en place un réglage qui partira de 1 à 100 (1 --> mauvaise qualité # et 100 --> très bonne qualité) calculValComp = (255 * j[3].spinCompression.value()) / 100 # Il faut soustraire le résultat à 255 pour # avoir une valeur reconnue par Mencoder calculValComp = 255 - calculValComp # Si la la valeur de réglage de la compression est réglée sur # 100, la valeur retournée sera 0 (ce qui va générer une erreur # dans Mencoder ... et ainsi stopper le process), la valeur # retournée sera donc de 1 (ce qui sera ok) if j[3].spinCompression.value() == 100: calculValComp = 1 # On attribue la valeur spin = str(calculValComp) elif j[0] in ['codec_3GP_ffmpeg']: # On affecte la valeur de la résolution pour le 3GP # sélectionnée par l'utilisateur self.valeurSize3GP = j[3].resoSortie3gp.currentText() elif j[0] in ['codec_AMV_ffmpeg']: # On affecte la valeur de la résolution pour l'AMV # sélectionnée par l'utilisateur self.valeurSizeAMV = j[3].resoSortieAMV.currentText() elif j[0] in ['codec_mov_ffmpeg']: # La valeur de compression vidéo va de 31 à 1 (31 --> mauvaise qualité # jusqu'à à 1 --> très bonne qualité). Ici on va calculer en mettant # en place un réglage qui partira de 1 à 100 (1 --> mauvaise qualité # et 100 --> très bonne qualité) calculValComp = (31 * j[3].spinCompression.value()) / 100 # Il faut soustraire le résultat à 31 pour # avoir une valeur reconnue par Mencoder calculValComp = 31 - calculValComp # Si la la valeur de réglage de la compression est réglée sur # 100, la valeur retournée sera 0 (ce qui va générer une erreur # dans Mencoder ... et ainsi stopper le process), la valeur # retournée sera donc de 1 (ce qui sera ok) if j[3].spinCompression.value() == 100: calculValComp = 1 # Appel de la fonction dans laquelle sont définies les tailles # des vidéos pour un traitement pour un changement de syntaxe self.tailleVideoRetouche() # La valeur est sous forme de tuple et contient au moins 2 valeurs self.valeurCompSizeMOV = (str(calculValComp), str(self.valeurSizeGeneral)) elif j[0] in ['avirawsanscompression']: # Appel de la fonction dans laquelle sont définies les tailles # des vidéos pour un traitement pour un changement de syntaxe self.tailleVideoRetouche() self.valeurSizeAVI_RAW = str(self.valeurSizeGeneral) elif j[0] in ['codecxvid']: # Appel de la fonction dans laquelle sont définies les tailles # des vidéos pour un traitement pour un changement de syntaxe self.tailleVideoRetouche() valeurSizeXVID = str(self.valeurSizeGeneral) # La valeur est sous forme de tuple et contient au moins 2 valeurs spin = (str(j[3].spinBitrateVideo.value()), valeurSizeXVID) elif j[0] in ['codec_hfyu_ffmpeg']: # Appel de la fonction dans laquelle sont définies les tailles # des vidéos pour un traitement pour un changement de syntaxe self.tailleVideoRetouche() self.valeurSizeHFYU = str(self.valeurSizeGeneral) else: spin = str(j[3].spinCompression.value()) debug( "%s %s %s %s" % (idCodec, chemin, spin, type(spin))) # Collecte des infos codec audio infosCodecAudio = {'Fichier':chemin} getParamVideo(chemin, ['ID_AUDIO_CODEC'], infosCodecAudio) try: audioCodec = infosCodecAudio['ID_AUDIO_CODEC'] except: audioCodec = "codec audio non disponible" # Appel des classes après séparation des traitements gérés par Mencoder, FFmpeg # et FFmpeg2theora. # Appel du moteur -> animation encodage avec un codec particulier try: if idCodec in ['copie', 'codecdivx4', 'codecmotionjpeg', 'codecmpeg1', 'codecmpeg2', 'codecwmv2', 'codecxvid', 'macromediaflashvideo', 'codech264mpeg4', 'codech264mpeg4_ext_h264']: mencoder = WidgetMEncoder(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = spin, laisserOuvert=ouvert) mencoder.setWindowTitle(_(u"Transcodage vidéo")) mencoder.exec_() elif idCodec in ['avirawsanscompression']: mencoder = WidgetMEncoder(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = self.valeurSizeAVI_RAW, laisserOuvert=ouvert) mencoder.setWindowTitle(_(u"Transcodage vidéo")) mencoder.exec_() elif idCodec in ['codecxvid']: mencoder = WidgetMEncoder(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = spin, laisserOuvert=ouvert) mencoder.setWindowTitle(_(u"Transcodage vidéo")) mencoder.exec_() elif idCodec in ['codec_hfyu_ffmpeg']: ffmpeg = WidgetFFmpeg(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = self.valeurSizeHFYU, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg.exec_() elif idCodec == 'codec_3GP_ffmpeg': # Pour le transcodage 3GP, si on charge une vidéo qui # comporte un canal audio, le transcodage n'a pas lieu if audioCodec == "codec audio non disponible": ffmpeg = WidgetFFmpeg(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = self.valeurSize3GP, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg.exec_() else: messErr3GP=QMessageBox(self) messErr3GP.setText(_(u"<p>Le transcodage des vidéos comportant une piste audio en 3GP a momentanément été désactivé.</b></p>")) messErr3GP.setWindowTitle(_(u"Erreur")) messErr3GP.setIcon(QMessageBox.Warning) messErr3GP.exec_() return elif idCodec == 'codec_AMV_ffmpeg': ffmpeg = WidgetFFmpeg(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = self.valeurSizeAMV, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg.exec_() elif idCodec == 'codec_mov_ffmpeg': ffmpeg = WidgetFFmpeg(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = self.valeurCompSizeMOV, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg.exec_() elif idCodec == 'codecoggtheora': #### Gestion de l'extension .h264 #### # Si on charge une vidéo avec extension .h264, ffmpeg2theora ne peut # pas effectuer l'encodage if ext_chargee == '.h264': messErrExtH264ffmpeg2th=QMessageBox(self) messErrExtH264ffmpeg2th.setText(_(u"<p>Il n'est pas possible de donner suite au traitement <b>à partir d'une vidéo avec extension h264 et en ayant choisi: %s.</b></p><p><b>Veuillez choisir un autre codec dans la liste proposée.</b></p>" % codec_reglage)) messErrExtH264ffmpeg2th.setWindowTitle(_(u"Erreur")) messErrExtH264ffmpeg2th.setIcon(QMessageBox.Warning) messErrExtH264ffmpeg2th.exec_() return else: ffmpeg2theora = WidgetFFmpeg2theora(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = spin, laisserOuvert=ouvert) ffmpeg2theora.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg2theora.exec_() else: #### Gestion de l'extension .h264 #### # Si on charge une vidéo avec extension .h264, FFmpeg ne peut # pas effectuer l'encodage if ext_chargee == '.h264': if codec_reglage in [u'Codec DV (.dv)', u'Codec QuickTime MOV (.mov)', u'Codec HFYU: Huffman Lossless YUV (yuv422p) (.avi)', u'Codec VOB (DVD-Video stream MPEG-2) (.vob)', u'Codec 3GP (3rd Generation Partnership Project) (.3gp)', u'Codec AMV: pour lecteurs mp4 (.avi)']: messErrExtH264ffmpeg=QMessageBox(self) messErrExtH264ffmpeg.setText(_(u"<p>Il n'est pas possible de donner suite au traitement <b>à partir d'une vidéo avec extension h264 et en ayant choisi: %s.</b></p><p><b>Veuillez choisir un autre codec dans la liste proposée.</b></p>" % codec_reglage)) messErrExtH264ffmpeg.setWindowTitle(_(u"Erreur")) messErrExtH264ffmpeg.setIcon(QMessageBox.Warning) messErrExtH264ffmpeg.exec_() return else: ffmpeg = WidgetFFmpeg(idCodec, chemin, cheminFichierEnregistrerVideo, valeurNum = spin, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Transcodage vidéo")) ffmpeg.exec_() #except Exception, e: except None: messageErreur=QMessageBox(self) messageErreur.setText(_(u"Un problème est survenu.")+str(e)) messageErreur.setWindowTitle(_(u"Erreur")) messageErreur.setIcon(QMessageBox.Warning) messageErreur.exec_() return self.lstFichiersSortie = cheminFichierEnregistrerVideo # pour la boite de dialogue de comparaison self.radioConvert.setChecked(True) self.radioSource.setEnabled(True) self.radioSource.setChecked(False) self.radioConvert.setEnabled(True) self.boutCompare.setEnabled(True) ### Information à l'utilisateur self.infoLog(None, chemin, None, cheminFichierEnregistrerVideo) return cheminFichierEnregistrerVideo # module séquentiel
def appliquer(self, nomSortie=None, ouvert=1): """ Appelle la boite de dialogue de sélection de fichier à sauver et appel de la fonction de conversion d'une vidéo en images """ # === Détermination des chemins d'entrée et sortie ===# chemin = self.getFile() if not nomSortie: suffix = "" saveDialog = EkdSaveDialog(self, mode="image", suffix=suffix, title=_(u"Sauver"), multiple=True) cheminFichierEnregistrerVideo = saveDialog.getFile() else: # module séquentiel cheminFichierEnregistrerVideo = nomSortie if not cheminFichierEnregistrerVideo: return ################################################################################### # Préfixe des images prefixeImg = os.path.basename(cheminFichierEnregistrerVideo) # Chemin du répertoire de sortie des images cheminRepDestination = ( os.path.dirname(cheminFichierEnregistrerVideo) + os.sep + os.path.basename(cheminFichierEnregistrerVideo) ) cheminVideoSource = unicode(self.getFile()) ################################################################################### try: #### la conversion de vidéo en images est maintenant gérée par FFmpeg ##### ffmpeg = WidgetFFmpeg("jpeg", cheminVideoSource, cheminRepDestination, laisserOuvert=ouvert) ffmpeg.setWindowTitle(_(u"Convertir une animation en images")) ffmpeg.exec_() ################################################################################################## except: messageErreur = QMessageBox(self) messageErreur.setText(_(u"Problème lors de la conversion d'une vidéo en images (ffmpeg) %s") % e) messageErreur.setWindowTitle(_(u"Erreur")) messageErreur.setIcon(QMessageBox.Warning) messageErreur.exec_() return imgDep = glob.glob(cheminRepDestination + "*.png") imgDep.sort() # Nettoyage ... insertion des images dans la liste de visualisation self.listeImgDestin = [] for parc_1 in imgDep: # Condition pour détection windows if os.name == "nt": if "\\" in parc_1: self.listeImgDestin.append(parc_1.replace("\\", "/")) # Condition pour détection Linux ou MacOSX elif os.name in ["posix", "mac"]: self.listeImgDestin.append(parc_1) # Affichage des images après traitement (appel de la fonction fctTab) self.conversionImg = 1 self.fctTab() ### Information à l'utilisateur self.infoLog(None, cheminVideoSource, None, self.listeImgDestin) return self.listeImgDestin # module séquentiel # ATTENTION IL FAUT AJOUTER CECI NE PAS OUBLIER !!! # La liste pour l'affichage des images ds l'interface est # vidée pour que les images affichées ne s'amoncellent pas # si plusieurs rendus à la suite self.listeImgDestin = [] # On libere la memoire del nomSortie, rep, chemin, prefixeImg, cheminRepDestination, cheminRepDestination, cheminVideoSource, commande, mencoder, listeFichiers, nomFichier