在Go 中使用os/exec 執行長時間運行的shell 指令時,即時擷取和處理輸出通常是有益的。以ffmpeg 指令為例,它以如下行的形式輸出進度資訊:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/
我們的目標是捕獲並處理這些行,提取進度資訊以顯示即時進度條.
與stdout 不同,ffmpeg將診斷訊息(控制台輸出)傳送到標準錯誤。透過修改程式碼以從 stderr 讀取,我們可以捕獲進度資訊:
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() }
透過此修改,我們可以在命令執行時連續列印進度資訊。
要提取進度信息,我們需要解析 stderr 中的行並隔離相關值。就ffmpeg 而言,我們對「時間」欄位感興趣:
time=00:00:04.13
透過解析該值並將其轉換為比率(例如,「4.13 秒/總持續時間」),我們可以以百分比顯示進度。這使我們能夠即時追蹤命令的進度並提供用戶友好的體驗。
以上是如何在 Go 中檢索和處理長時間運行的 Shell 命令的即時輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!