問題:
長時間実行されるシェル コマンドを実行する場合Go で os/exec を使用してリアルタイム出力を取得し、それをそのまま処理するにはどうすればよいですか?利用可能ですか?
解決策:
stdout の代わりに stderr を使用します:
ffmpeg は次のように知られています。診断メッセージを stdout ではなく stderr に出力します。したがって、コマンド オブジェクトを作成するときは、stdout ではなく stderr に接続します。
stderr から出力を継続的に読み取ります:
Create a bufio.Scanner for stderr を読み込み、Scan メソッドを使用して出力を 1 行ずつ、または 1 ワードずつ読み取ります。 word.
出力行ごとの処理:
コード例では、scanner.Split(bufio.ScanWords) を使用して分割しています。スペースに関する出力。処理要件に基づいて分割タイプを調整します。
出力の処理:
抽出や処理など、必要な方法で出力を操作します。進行状況情報。
例コード:
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() }
出力:
このコードは、次のような ffmpeg 出力メッセージを継続的に出力します。
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/s
以上がGoのシェルコマンドからリアルタイム出力を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。