最近在做php服务迁移,遇到了需要调用系统外部命令(ffmpeg),处理视频预览图的情况,以前php是直接找了轮子(php-ffmpeg)解决的,但本质其实也就是调用了相关函数执行系统外部的命令。golang也有os/exec这个包支持,标注一下备忘。

1、其实主要是以下几个方法

func Command(name string, arg ...string) *Cmd
func (c *Cmd) Output() ([]byte, error)
func (c *Cmd) CombinedOutput() ([]byte, error)

通过调用exec.Command()执行系统外部命令,通过*Cmd.Output()或者*Cmd.CombinedOutput()获取执行结果输出。 需要注意的是exec.Command()这个方法的传参。

例如下面的命名:ffmpeg -i input.flv -ss 00:00:14.435 -vframes 1 out.png

对应的调用方式是:exec.Command("ffmpeg", "-i", "input.flv", "-ss", "00:00:00", "-vframes", "1", "out.png")

2、针对1中提到的情况,写了个例子。

package main

import (
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    cmd := "/usr/local/bin/ffmpeg"
    args := "-i %s -ss 00:00:00 -vframes 1 %s"
    output, err := exec.Command(cmd, strings.Split(fmt.Sprintf(args, "input.flv", "out.png"), " ")...).CombinedOutput()
    fmt.Printf("err: %v\nout: %v\n", err, string(output))
}

参考