为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容3067478 2023-06-05 17:50:52
我正在尝试使用 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.Buffercmd.Stdout = &outerr := 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)然后它工作正常,我可以打开它。
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

更新:事实证明问题是-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)

}


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信