How to get the realtime output for a shell command in golang?

前端 未结 4 588
渐次进展
渐次进展 2020-12-25 14:35

I am trying to call shell command with os/exec in golang, that command will take some time, so I would like to retrieve the reatime output and print the processed output (a

4条回答
  •  借酒劲吻你
    2020-12-25 14:59

    Looks like ffmpeg sends all diagnostic messages (the "console output") to stderr instead of stdout. Below code works for me.

    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()
    }
    

    The version of ffmpeg is detailed as below.

    ffmpeg version 3.0.2 Copyright (c) 2000-2016 the FFmpeg developers
    built with Apple LLVM version 7.3.0 (clang-703.0.29)
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.0.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --enable-vda
    libavutil      55. 17.103 / 55. 17.103
    libavcodec     57. 24.102 / 57. 24.102
    libavformat    57. 25.100 / 57. 25.100
    libavdevice    57.  0.101 / 57.  0.101
    libavfilter     6. 31.100 /  6. 31.100
    libavresample   3.  0.  0 /  3.  0.  0
    libswscale      4.  0.100 /  4.  0.100
    libswresample   2.  0.101 /  2.  0.101
    libpostproc    54.  0.100 / 54.  0.100
    

提交回复
热议问题