猿问

使用 go 图像库从 stdout 解码 bmp 图像

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


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)

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


慕容3067478
浏览 161回答 1
1回答

慕无忌1623718

更新:事实证明问题是-ss需要时间而不是帧索引。我试图重现这个问题,但它似乎对我有用。也许添加cmd.Stderr = os.Stderr以查看 ffmpeg 输出是否提供了线索。您还可以发布一个完全可运行的示例吗?package mainimport (    "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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答