我正在尝试使用Golang中的os/exec调用shell命令,该命令将需要一些时间,因此我想实时检索输出并打印处理后的输出(一个进度比率数字)。
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)
}
我希望有一个函数能够在执行print命令时更新屏幕。
ffmpeg命令输出如下:
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/
事实上,上述4行是ffmpeg命令输出的最后一行,会不断变化,我想将其打印出来,例如:
18%
44%
69%
100%
我该如何实现这个目标?
fmt
库提供了一组扫描函数,可以将格式化的字符串解析为值。您可以在 stdout 管道上使用 Scanner 来处理每行并扫描每个格式化的行。您需要找出如何从 ffmpeg 中计算完整比例与总比例的比率。 - Ben Campbell