Декодирование изображений bmp из stdout с использованием библиотеки изображений go - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь декодировать изображение bmp, используя библиотеки image и golang.org/x/image/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) Однако это выдает ошибку «image: unknown format».Я уже зарегистрировал формат 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 Ответ

0 голосов
/ 11 февраля 2019

Обновление: выясняется, что проблема была -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)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...