我正在尝试使用image和golang.org/x/image/bmp库对bmp图像进行解码。图像由ffmpeg输出到stdout。这是获取框架的代码:

cmd := exec.Command("ffmpeg", "-accurate_seek", "-ss", strconv.Itoa(index), "-i",
    filename, "-frames:v", "1", "-hide_banner", "-loglevel", "0", "pipe:.bmp")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}

o := bufio.NewReader(&out)

然后我用img, _, err := image.Decode(o)解码
但是,这会出现“图像:未知格式”错误。我已经在main方法中注册了bmp格式,并且以前我已经从磁盘成功解码了实际的BMP文件,而不仅仅是从stdout解码。

我已经尝试过仅使用bmp.Decode而不是image.Decode,但这仅给出错误“EOF”。

我以为可能不是以正确的方式获取标准输出,但是如果我直接将其写入文件:
o := bufio.NewReader(&out)

outputfile, err := os.Create("test.bmp")
if err != nil {
    log.Fatal(err)
}
defer outputfile.Close()
io.Copy(outputfile, o)

然后它可以正常工作,我可以打开它。

编辑:code

最佳答案

更新:原来是-ss需要时间而不是帧索引的问题。

我试图重现该问题,但它似乎对我有用。也许添加cmd.Stderr = os.Stderr来查看ffmpeg输出是否给出线索。您还可以发布一个完全可运行的示例吗?

package main

import (
    "bytes"
    "image"
    "log"
    "os"
    "os/exec"

    _ "golang.org/x/image/bmp"
)

func main() {
    cmd := exec.Command(
        "docker", "run",
        "--rm",
        "mwader/static-ffmpeg",
        "-ss", "5",
        "-f", "lavfi",
        "-i", "testsrc",
        "-frames:v", "1",
        "-f", "image2",
        "-vcodec", "bmp",
        "pipe:1",
    )
    var out bytes.Buffer
    cmd.Stderr = os.Stderr
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }

    img, imgFormat, imgErr := image.Decode(&out)

    log.Printf("img.Bounds(): %#+v\n", img.Bounds())
    log.Printf("imgFormat: %#+v\n", imgFormat)
    log.Printf("imgErr: %#+v\n", imgErr)
}

关于image - 使用Go图像库从stdout解码bmp图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54618541/

10-13 08:38