Masalah:
Apabila melaksanakan arahan shell yang berjalan lama dalam Go menggunakan os/exec, bagaimana anda boleh mendapatkan semula output masa nyata dan memprosesnya apabila ia menjadi tersedia?
Penyelesaian:
Gunakan stderr Daripada stdout:
ffmpeg diketahui keluarkan mesej diagnostik kepada stderr dan bukannya stdout. Oleh itu, sambungkan kepada stderr apabila mencipta objek arahan dan bukannya stdout.
Baca Output daripada stderr Secara Berterusan:
Buat bufio.Pengimbas untuk stderr dan gunakan kaedah Imbas untuk membaca baris keluaran demi baris atau perkataan demi perkataan.
Kendalikan Output Baris demi Baris:
Dalam kod contoh, pengimbas.Split(bufio.ScanWords) digunakan untuk memisahkan output pada ruang. Laraskan jenis pemisahan berdasarkan keperluan pemprosesan anda.
Output Proses:
Memanipulasi output mengikut cara yang anda inginkan, seperti mengekstrak dan memproses maklumat kemajuan.
Contoh Kod:
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() }
Output:
Kod akan terus mencetak mesej output ffmpeg, seperti:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/s
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Output Masa Nyata daripada Perintah Shell dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!