Bonjour,
Je développe une petite application sous Linux (mais peu importe puisqu'en python) qui a besoin de lancer des commandes ffmpeg depuis une liste d'url. Pour chaque commande ffmpeg, je veux pouvoir afficher la progression de cette commande. Mon problème est que ces commandes mettent beaucoup de temps à être effectuée, ce qui déclenche un timeout du QProcess sauf si j'utilise WaitForFinished(-1). Cependant, utliliser WaitForFinished(-1) comme je le fais provoque l'affichage du message "main.py ne répond pas, attendre ou forcer à quitter".
J'ai du mal à imaginer une autre solution car je débute en python et que ça touche des concepts que je ne maîtrise pas encore.
Je vous mets donc quelques portions intéressantes du code pour que vous puissiez m'aider si possible.
En gros, le code ci-dessus récupère, pour chaque élément de self.listDL, un fichier m3u8 qui va ensuite être ouvert avec FFMPEG pour télécharger la vidéo associée. Comme vous le voyez, un QProcess (self.p) est initialisé dans la fonction self.startDownload() ci-dessous et j'ai effectué des connexions avec les événements du QProcess pour avoir la progression.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # Lancement des téléchargements for i in range(self.listDL.count()): epItem: CustomListWidgetItem = self.listDL.item(i) epData = self.client.makeRequest("Épisode", epItem.id) ... # Récupération de la liste de lecture finale if self.getFinalM3u8(url, epData['id']): # Téléchargement avec FFMPEG m3u8 = f"{os.getcwd()}/downloads/{epData['id']}.m3u8" cmdLine = f"-protocol_whitelist file,http,https,tcp,tls,crypto,data -y -i \"{m3u8}\" -c copy -bsf:a aac_adtstoasc \"{os.getcwd()}/downloads/{fileName}.mp4\" -v quiet -stats" self.file = f"{os.getcwd()}/downloads/{fileName}.mp4" self.startDownload(cmdLine) self.p.waitForFinished(-1) os.remove(m3u8)
Je précise que le code fonctionne, les téléchargements se font, tout est ok à part ce message. J'ai cru comprendre qu'il était possible de passer par un QThread mais je ne sais pas faire donc si quelqu'un veut bien m'indiquer (et m'expliquer) une solution, ce serait sympa. Il reste quelques détails à régler (comme par exemple l'utilisation d'os.path pouur gérer les chemins de façons à rendre l'outil multiplateforme) mais je suis ravi d'avoir réussi à faire ça déjà, ce serait dommage de bloquer sur un dernier détail.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 def startDownload(self, cmd: str): if self.p is None: self.message("Début du téléchargement...") self.p = QProcess() args = shlex.split(cmd) self.pbDL.setRange(0, 100) self.pbDL.setValue(0) self.p.readyReadStandardError.connect(self.handleProgress) self.p.finished.connect(self.dlFinished) self.p.start("ffmpeg", args) def handleProgress(self): data = self.p.readAllStandardError() stderr = bytes(data).decode("utf8") with open("error.txt", "+a") as out: out.write(stderr) if self.file != None: self.pbDL.setValue(round((os.stat(self.file).st_size / self.dlSize) * 100)) def dlFinished(self): self.message("Téléchargement terminé.") self.p = None self.dlSize = None self.file = None
Merci d'avance.
Partager