我试图使用图像和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)
对其进行解码,但是这会产生一个“图像:未知格式”的错误。我已经在主方法中注册了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)
然后它就可以正常工作了,我可以打开它。
编辑:代码
发布于 2019-02-10 23:56:09
更新:发现问题是-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)
}
https://stackoverflow.com/questions/54618541
复制相似问题