golang 通过 ffmpeg 在内存中完成视频截图操作

早上划水的时候,一个朋友过来问我,golang 怎么在内存中通过 ffmpeg 对视频完成截图操作,朋友是做直播相关的业务,ffmpeg 我也是处于听过没用过的东西,为此我也是基于浏览器完成此次功能, 网上大部分教程都是基于本地文件,或者一些老代码已经卡死不能调试的情况

代码展示

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "os/exec"
)

func main() {
    fi, _ := ioutil.ReadFile("dir/webwxgetvideo.mp4")
    b := runFFMPEGFromStdin(fi)
    writeImage(b)
}

func runFFMPEGFromStdin(file []byte) []byte {
    width := 360
    height := 640
    log.Print("Size of the video: ", len(file))

    cmd := exec.Command("ffmpeg", "-i", "pipe:0", "-vframes", "1", "-ss", "000001.000", "-s", fmt.Sprintf("%dx%d", width, height), "-f", "singlejpeg", "-")
    cmd.Stdin = bytes.NewReader(file)

    var imageBuffer bytes.Buffer
    cmd.Stdout = &imageBuffer
    err := cmd.Run()

    if err != nil {
        log.Panic("ERROR")
    }
    return imageBuffer.Bytes()

}

func writeImage(b []byte) {
    fo, _ := os.Create("dir/1b11.jpg")
    fo.Write(b)
    fo.Close()
}

4月9日更新: 上面的问题针对MP4视频格式没得问题,然而IOS的视频为MOV格式 就会触发error

比如:

# 这样可以
cat webwxgetvideo.mp4 |ffmpeg  -i pipe:0 -vframes 1 -f singlejpeg - >a1.jpg
# 换成mov 就不行
cat xxx.mov |ffmpeg  -i pipe:0 -vframes 1 -f singlejpeg - > a1.jpg

# 不用管道又可以了
ffmpeg  -i xxx.mov -vframes 1 -f singlejpeg - > a1.jpg

待修改……