Go 从视频字节中获取帧

Go 从视频字节中获取帧,go,ffmpeg,Go,Ffmpeg,我正在使用ffmpeg和golang从视频中提取一帧。如果我有一个以字节为单位的视频,而不是以.mp4的形式保存在磁盘上,我如何告诉ffmpeg从这些字节中读取,而不必将文件写入磁盘,因为这要慢得多 我可以从文件中读取,但我不确定如何从字节中读取 我看过ffmpeg文档,但只看到了输出示例,而没有看到输入示例 func ExtractImage(fileBytes[]字节){ //命令行参数、路径和命令 command=“ffmpeg” frameExtractionTime:=“0:00:05

我正在使用ffmpeg和golang从视频中提取一帧。如果我有一个以字节为单位的视频,而不是以.mp4的形式保存在磁盘上,我如何告诉ffmpeg从这些字节中读取,而不必将文件写入磁盘,因为这要慢得多

我可以从文件中读取,但我不确定如何从字节中读取

我看过
ffmpeg
文档,但只看到了输出示例,而没有看到输入示例

func ExtractImage(fileBytes[]字节){
//命令行参数、路径和命令
command=“ffmpeg”
frameExtractionTime:=“0:00:05.000”
vFrame:=“1”
qv:=“2”
输出:=“/home/ubuntu/media/video-to-image/output-”+time.Now().Format(time.Kitchen)+“.jpg”
//TODO:使用文件字节而不是视频路径
//创建命令
cmd:=执行命令(命令,
“-ss”,帧提取时间,
“我”,视频路径,
“-vframes”,vframes,
“-q:v”,qv,
输出)
//运行该命令,不要等待它完成。正在运行waiting exec
//为了举例而忽略错误
_=cmd.Start()
_=cmd.Wait()
}

通过指定
-
作为选项
-i
的值,您可以使
ffmpeg
从stdin读取数据,而不是从磁盘读取文件。然后将视频字节作为stdin传递给命令

func ExtractImage(fileBytes []byte){

    // command line args, path, and command
    command := "ffmpeg"
    frameExtractionTime := "0:00:05.000"
    vframes := "1"
    qv := "2"
    output := "/home/ubuntu/media/video-to-image/output-" + time.Now().Format(time.Kitchen) + ".jpg"

    cmd := exec.Command(command,
        "-ss", frameExtractionTime,
        "-i", "-",  // to read from stdin
        "-vframes", vframes,
        "-q:v", qv,
        output)

    cmd.Stdin = bytes.NewBuffer(fileBytes)

    // run the command and don't wait for it to finish. waiting exec is run
    // ignore errors for examples-sake
    _ = cmd.Start()
    _ = cmd.Wait()
}
您可能需要运行
ffmpeg-protocols
,以确定在构建ffmpeg时是否支持
pipe
协议(从stdin读取)