从视频帧创建图像

时间:2018-04-12 14:11:04

标签: image go video frame

我的一个API接受mp4视频文件,然后将文件上传到我的云(AWS-S3)。我从正文中读取视频,这意味着整个视频采用raw []字节格式,然后直接将其传输到我的存储。问题是,那些视频非常大,当用户想要下载视频时,他需要等待很长时间。显示带有进度条的黑屏30秒显然会损害用户体验。我需要以缩略图的形式向他展示至少某种预览。

现在这是我的问题。我没有找到有关如何选择视频的第一帧然后将其渲染为图像的任何资源。

来自Stackoverflow的用户在2年后问了这个问题:First frame of video使用了ffmpeg来实现这个目标,但他的背景和问题却不同。他需要从静态文件中获取第一帧,而我从http主体以普通[]字节格式获取视频。对他的问题的答案,因此不适用于我的。

不要误会我的意思,我不是要求你为我做,所以我可以将它复制并粘贴到我的代码库中。我只是需要某种线索。

感谢您的帮助。

(编辑:我试过把它管到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))

但是输出是空图像。

  

2018/04/14 12:41:50图片大小:0

0 个答案:

没有答案