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