登录
首页 >  Golang >  Go问答

从视频中提取帧

来源:stackoverflow

时间:2024-02-24 19:12:25 309浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《从视频中提取帧》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在使用 ffmpeg 和 golang 从视频中提取帧。如果我有一个以字节为单位的视频,而不是作为 .mp4 保存在磁盘上,我如何告诉 ffmpeg 从这些字节读取,而不必将文件写入磁盘,因为这样要慢得多?

我可以从文件中读取数据,但我不确定如何从字节中读取。

我在这里查看了 ffmpeg 文档,但只看到了输出示例而不是输入示例。

func ExtractImage(fileBytes []byte){

    // command line args, path, and command
    command = "ffmpeg"
    frameExtractionTime := "0:00:05.000"
    vframes := "1"
    qv := "2"
    output := "/home/ubuntu/media/video-to-image/output-" + time.Now().Format(time.Kitchen) + ".jpg"

    // TODO: use fileBytes instead of videoPath
    // create the command
    cmd := exec.Command(command,
        "-ss", frameExtractionTime,
        "-i", videoPath,
        "-vframes", vframes,
        "-q:v", qv,
        output)

    // run the command and don't wait for it to finish. waiting exec is run
    // ignore errors for examples-sake
    _ = cmd.Start()
    _ = cmd.Wait()
}

解决方案


您可以通过将 - 指定为选项 -i 的值,使 ffmpeg 从 stdin 读取数据,而不是从磁盘读取文件。然后只需将视频字节作为标准输入传递给命令即可。

func ExtractImage(fileBytes []byte){

    // command line args, path, and command
    command := "ffmpeg"
    frameExtractionTime := "0:00:05.000"
    vframes := "1"
    qv := "2"
    output := "/home/ubuntu/media/video-to-image/output-" + time.Now().Format(time.Kitchen) + ".jpg"

    cmd := exec.Command(command,
        "-ss", frameExtractionTime,
        "-i", "-",  // to read from stdin
        "-vframes", vframes,
        "-q:v", qv,
        output)

    cmd.Stdin = bytes.NewBuffer(fileBytes)

    // run the command and don't wait for it to finish. waiting exec is run
    // ignore errors for examples-sake
    _ = cmd.Start()
    _ = cmd.Wait()
}

您可能需要运行 ffmpeg -protocols 来确定您的 ffmpeg 版本是否支持 pipe 协议(从标准输入读取)。

到这里,我们也就讲完了《从视频中提取帧》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>