Lors de l'exécution de commandes Shell de longue durée avec os/exec dans Go, il est souvent avantageux de récupérer et de traiter la sortie en temps réel . Prenez, par exemple, la commande ffmpeg, qui génère des informations de progression sous la forme de lignes comme celle-ci :
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/
Notre objectif est de capturer et de traiter ces lignes, en extrayant les informations de progression pour afficher une barre de progression en direct. .
Contrairement à stdout, ffmpeg envoie des messages de diagnostic (sortie de la console) à stderr. En modifiant notre code pour lire à partir de stderr à la place, nous pouvons capturer les informations de progression :
package main import ( "bufio" "fmt" "os/exec" "strings" ) func main() { args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb" cmd := exec.Command("ffmpeg", strings.Split(args, " ")...) stderr, _ := cmd.StderrPipe() cmd.Start() scanner := bufio.NewScanner(stderr) scanner.Split(bufio.ScanWords) for scanner.Scan() { m := scanner.Text() fmt.Println(m) } cmd.Wait() }
Avec cette modification, nous pouvons imprimer en continu les informations de progression pendant l'exécution de la commande.
Pour extraire les informations de progression, nous devons analyser les lignes de stderr et isoler les valeurs pertinentes. Dans le cas de ffmpeg, nous nous intéressons au champ "time":
time=00:00:04.13
En analysant cette valeur et en la convertissant en un ratio (par exemple, "4,13 secondes / durée totale"), nous pouvons afficher la progression sous forme de pourcentage. Cela nous permet de suivre la progression de la commande en temps réel et d'offrir une expérience conviviale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!