Ejemplo n.º 1
0
	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
Ejemplo n.º 2
0
	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_()
Ejemplo n.º 3
0
	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
Ejemplo n.º 4
0
	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
Ejemplo n.º 5
0
    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