Criando uma imagem a partir de um quadro de vídeo

Uma das minhas APIs aceita um arquivo de vídeo mp4 e depois carrega o arquivo na minha nuvem (AWS-S3). Eu leio o vídeo do corpo, o que significa que o vídeo inteiro está no formato bruto [] byte e, em seguida, direciono-o diretamente para o meu armazenamento. O problema é que esses vídeos são muito grandes e, quando o usuário deseja fazer o download do vídeo, ele precisa esperar muito tempo. Mostrar uma tela preta com uma barra de progresso por 30 segundos obviamente prejudica a experiência do usuário. Eu preciso mostrar a ele pelo menos algum tipo de visualização na forma de uma miniatura.

Agora esse é o meu problema. Não encontro recursos para escolher o primeiro quadro de um vídeo e depois renderizá-lo em uma imagem.

Um usuário do Stackoverflow fez esta pergunta há 2 anos:Primeiro quadro de vídeo usou o ffmpeg para conseguir isso, mas seu contexto e problema eram diferentes. Ele precisava obter o primeiro quadro de um arquivo estático, enquanto eu tenho o vídeo no formato simples [] byte de um corpo http. A resposta à sua pergunta não pode, portanto, ser aplicada à minha.

Não me interpretem mal, não estou pedindo para você fazer isso por mim, para que eu possa copiá-lo e colá-lo na minha base de código. Eu só preciso de algum tipo de pista.

Obrigado pela ajuda.

(Edição: Eu tentei canalizá-lo para ffmpeg:

    log.Print("Creating thumbnail..")
    width := 640
    height := 360
    var imageBuffer bytes.Buffer
    log.Print("Size of the video: ", len(videoData))

    cmd := exec.Command("ffmpeg", "-i", "pipe:0", "-vframes", "1", "-s", fmt.Sprintf("%dx%d", width, height), "-f", "singlejpeg", "-")
    cmd.Stdout = &imageBuffer

    stdinPipe, pipeError := cmd.StdinPipe()
    _ = pipeError
    defer  stdinPipe.Close()

    log.Print("write to pipe..")
    err := cmd.Start()

    n, writingErr := stdinPipe.Write(videoData)

        if writingErr != nil {
            log.Panic("WRITING ERROR")

        }
    log.Print("Bytes written: ", n)


    log.Print("pipe has been written to")
    cmd.Wait()
    log.Print("Waited..")

    if err != nil {
        ErrorLogger.ReportErrorAndWait(ErrorLogger.ErrorMessage{Error: err, Message: "Unable to create thumbnail.", Priority: ErrorLogger.HIGH_PRIORITY, Category: "upload"})
        log.Panic("ERROR")
        go UploadThumbnail(videoData, fileNameWithoutType)
    }

    imageBytes := imageBuffer.Bytes()
    log.Print("Size of the image: ", len(imageBytes))

Mas a saída foi uma imagem vazia.

2018/04/14 12:41:50 Tamanho da imagem: 0

questionAnswers(0)

yourAnswerToTheQuestion