Problem:
Beim Ausführen eines Shell-Befehls mit langer Laufzeit Wie können Sie in Go mit os/exec die Echtzeitausgabe abrufen und so verarbeiten, wie sie ist? verfügbar?
Lösung:
Verwenden Sie stderr anstelle von stdout:
ffmpeg ist bekanntermaßen Diagnosemeldungen an stderr statt an stdout ausgeben. Stellen Sie daher beim Erstellen des Befehlsobjekts eine Verbindung zu stderr statt zu stdout her.
Ausgabe von stderr kontinuierlich lesen:
Erstellen Sie einen bufio.Scanner für stderr und verwenden Sie die Scan-Methode, um die Ausgabe Zeile für Zeile oder Wort für Zeile zu lesen Wort.
Ausgabe Zeile für Zeile verarbeiten:
Im Beispielcode wird ein scanner.Split(bufio.ScanWords) zum Teilen verwendet die Ausgabe auf Leerzeichen. Passen Sie den Aufteilungstyp entsprechend Ihren Verarbeitungsanforderungen an.
Ausgabe verarbeiten:
Manipulieren Sie die Ausgabe auf die gewünschte Weise, z. B. durch Extrahieren und Verarbeiten Fortschrittsinformationen.
Beispiel Code:
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() }
Ausgabe:
Der Code druckt kontinuierlich die ffmpeg-Ausgabemeldungen, wie zum Beispiel:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/s
Das obige ist der detaillierte Inhalt vonWie erhalte ich eine Echtzeitausgabe von Shell-Befehlen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!