le programme que je cherche à écrire c'est pour faire des conversions audio/vidéo toute bête mais j'aimerais le retour dans mon programme, pas que ça s'ouvre salement en dehors
Si tu n'as pas besoin d'interagir en cours de conversion, alors tu peux générer le log et analyser ce dernier.
C'est un moyen plus fiable que d'essayer de capter le contenu de la console qui peut être différent selon le code page de cette dernière et qui peut être refermé par un autre programme. C'est comme cela qu'on procède le souvent en administration système.
Petit example (testé) qui lance une conversion puis cherche "successfully decoded" dans le log.
(Il suffit d'utiliser FindString ou les RegEx sur la variable Txt$ pour extraire ce qu'on veut)
Code : Tout sélectionner
; Récupération et analyse log ffmpeg.exe
; (C)Marc56 - 2022/06/15
; https://www.purebasic.fr/french/viewtopic.php?t=18686
EnableExplicit
Enumeration
#Win
#Edit
EndEnumeration
SetGadgetFont(#PB_Default, FontID(LoadFont(#PB_Any, "Consolas", 10)))
OpenWindow(#Win, 100, 100, 800, 600, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
CreateStatusBar(0, WindowID(#Win))
AddStatusBarField(#PB_Ignore)
StatusBarText(0, 0, "")
EditorGadget(#Edit, 5, 5, WindowWidth(#Win) - 10, WindowHeight(#Win) - StatusBarHeight(0) - 10)
StatusBarText(0, 0, "Conversion en Cours. Veuillez Patienter...")
; --- Donner un nom fixe au fichier de log
; (sinon il est horodaté HHMMSS ce qui rend difficile la relecture)
; voir aide ffmpeg.exe https://ffmpeg.org/ffmpeg.html
; chercher -report
SetEnvironmentVariable("FFREPORT", "file=ffreport.log")
; --- Convertir
RunProgram("ffmpeg",
"-i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3 -report -y",
"C:\Tmp",
#PB_Program_Hide | #PB_Program_Wait)
StatusBarText(0, 0, "Conversion Terminée. Chargement fichier de Log")
; --- Lecture Log
If Not OpenFile(0, "C:\Tmp\ffreport.log")
Debug "Fichier non chargé" : End
EndIf
While Not Eof(0)
Define Txt$ = ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(0)
SetGadgetText(#Edit, Txt$)
; --- Analyse du log (exemple)
If FindString(Txt$, "successfully decoded")
StatusBarText(0, 0, "Succès !")
Else
StatusBarText(0, 0, "Erreur")
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_SizeWindow
ResizeWindow(#Win, #PB_Ignore, #PB_Ignore, WindowWidth(#Win), WindowHeight(#Win) )
ResizeGadget(#Edit, #PB_Ignore, #PB_Ignore, WindowWidth(#Win) - 10, WindowHeight(#Win) - 32)
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
ForEver
End
- Il faut ajouter une variable d'environnement, sinon le log à un nom horodaté et cela rend difficile la relecture (il faudrait chercher le plus récent dans le répertoire)
- Comme ffmpeg.exe est lancé avec #PB_Program_Hide, il n'ouvre pas de fenêtre.
- Pas besoin de CMD /C ou /K ici puisqu'on n'a pas d'interaction avec le shell et que ffmpeg n'est pas une commande interne.
