【发布时间】:2016-09-02 15:28:39
【问题描述】:
我正在尝试在 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)
}
我想要一个功能,当命令打印一些东西时可以更新屏幕,
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库具有一组扫描函数,可以将格式化的字符串解析为值。您可以在标准输出管道上使用扫描仪来扫描行并扫描每个格式化的行。您需要从 ffmpeg 中找出完整与总数的比率。 -
@icza,请您看看我发布的答案,为什么我没有在屏幕上打印任何内容?
-
@seaguest 我也在这里添加了答案。