在 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中文网其他相关文章!