Ich versuche, Shell-Befehl mit os/exec in Golang aufrufen, dieser Befehl wird einige Zeit dauern, so möchte ich die reatime Ausgabe abrufen und die verarbeitete Ausgabe (eine fortschreitende Verhältniszahl) drucken.Wie bekomme ich die Echtzeit-Ausgabe für einen Shell-Befehl in Golang?
package main
import (
"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"
)
func main() {
cmdName := "ffmpeg -i t.webm -acodec aac -vcodec libx264 cmd1.mp4"
cmdArgs := strings.Fields(cmdName)
cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
stdout, _ := cmd.StdoutPipe()
cmd.Start()
go print(stdout)
cmd.Wait()
}
// to print the processed information when stdout gets a new line
func print(stdout io.ReadCloser) {
r := bufio.NewReader(stdout)
line, _, err := r.ReadLine()
fmt.Println("line: %s err %s", line, err)
}
Ich möchte eine Funktion haben, wo Sie den Bildschirm aktualisieren, wenn der Befehl Druck etwas,
Die ffmpeg Befehlsausgabe ist wie folgt:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/
frame= 169 fps=168 q=28.0 size= 227kB time=00:00:06.82 bitrate= 272.6kbits/
frame= 231 fps=153 q=28.0 size= 348kB time=00:00:09.31 bitrate= 306.3kbits/
frame= 282 fps=140 q=28.0 size= 499kB time=00:00:11.33 bitrate= 360.8kbits/
in der Tat, die über 4 line ist die letzte Zeile der ffmpeg Befehlsausgabe, die sich ständig ändert, ich möchte diese Änderung ausdrucken, wie
Wie könnte ich das erreichen?
Die 'fmt'-Bibliothek verfügt über eine Reihe von Scanfunktionen, die eine formatierte Zeichenfolge in Werte parsen können. Sie können einen Scanner in der Standardausgabe für Linien verwenden und jede formatierte Linie scannen. Sie müssten herausfinden, wie das Verhältnis von vollständig zu insgesamt von der ffmpeg. –
Mögliche Duplikate von [Streaming-Befehle Ausgabefortschritt] (http://stackoverflow.com/questions/30725751/streaming-commands-output-progress) – icza
@icza, können Sie bitte einen Blick auf meine veröffentlichte Antwort, warum ich nichts bekommen auf dem Bildschirm gedruckt? – seaguest