Golang集成FFmpeg的音视频处理的实现

 更新时间:2025年02月17日 10:55:18   作者:Yy_Yyyyy_zz  
FFmpeg是一个开源的音视频处理工具,广泛用于视频转换、截图、处理和流媒体推送等操作,本文主要介绍了Golang集成FFmpeg的音视频处理的实现,具有一定的参考价值,感兴趣的可以了解一下

概述

FFmpeg是一个开源的音视频处理工具,广泛用于视频转换、截图、处理和流媒体推送等操作。在Go语言项目中,FFmpeg可以通过调用系统命令来实现相关操作。本文将介绍如何在Go语言中集成并使用FFmpeg,特别是在视频处理中截取关键帧并生成图片的应用。

使用步骤

  • 安装FFmpeg首先确保FFmpeg已安装并配置在系统的环境变量中。可以通过运行以下命令来检查FFmpeg是否已安装:

    ffmpeg -version
    

    如果没有安装,可以根据操作系统的不同,选择相应的安装方式。

  • 安装Go语言依赖库在Go语言中,FFmpeg的调用通常通过执行exec.Command来实现,因此只需要使用Go标准库os/exec即可执行FFmpeg命令。无须额外安装第三方库。

  • 调用FFmpeg命令使用exec.Command来执行FFmpeg命令,并捕获命令执行结果。

FFmpeg常用指令

以下是一些FFmpeg的常用命令行参数,可以帮助你在Go项目中更好地利用FFmpeg:

  • 视频转码转换视频格式(例如:将MP4转换为AVI):

    ffmpeg -i input.mp4 output.avi
    
  • 截取视频截图截取视频的关键帧:

    ffmpeg -i input.mp4 -vf "select='eq(pict_type,I)'" -vsync vfr output_%03d.jpg
    
  • 设置截图的间隔时间每隔一定时间截取一次图片:

    ffmpeg -i input.mp4 -vf "fps=1/5" output_%03d.jpg
    
  • 提取视频中的音频提取视频中的音频并保存为MP3格式:

    ffmpeg -i input.mp4 -vn output.mp3
    

关键帧截取逻辑代码实现

接下来,我们将详细解释一个基于Go语言和FFmpeg的示例代码,这个示例代码会从视频中每隔一定时间截取关键帧,并返回相应的图片。

代码实现

以下是实现“根据指定时间间隔截取视频关键帧”的Go语言代码。

// GetMp4ImagesIntervalSeconds
// @Description: 指定时长截取图片
// @param videoBase64 base64视频
// @param intervalSeconds 截图间隔秒数
// @return imageSlice 截图切片
func GetMp4ImagesIntervalSeconds(videoBase64 string, intervalSeconds int) (imageSlice []ImageInfo, err error) {
    // 解码base64字符串
    videoData, err := base64.StdEncoding.DecodeString(videoBase64)
    if err != nil {
        Log.LogError("GetMp4ImagesIntervalSeconds DecodeString err:%v", err.Error())
        return nil, err
    }

    //判断目录是否存在
    if _, err = os.Stat("./temp"); os.IsNotExist(err) {
        err = os.Mkdir("./temp", 0755)
        if err != nil {
            Log.LogError("GetMp4ImagesIntervalSeconds os.Mkdir err:%v", err.Error())
            return nil, err
        }
    }

    // 创建临时视频文件
    tmpVideoFile, err := os.CreateTemp("./temp", "tempvideo_*.mp4")
    if err != nil {
        Log.LogError("GetMp4ImagesIntervalSeconds os.CreateTemp err:%v", err.Error())
        return nil, err
    }
    defer os.Remove(tmpVideoFile.Name())
    defer tmpVideoFile.Close()

    // 将视频数据写入临时文件
    _, err = tmpVideoFile.Write(videoData)
    if err != nil {
        Log.LogError("GetMp4ImagesIntervalSeconds tmpVideoFile.Write err:%v", err.Error())
        return nil, err
    }

    // 创建临时图片目录
    tempImageDir, err := os.MkdirTemp("./temp", "tempimage_")
    if err != nil {
        Log.LogError("GetMp4ImagesIntervalSeconds os.MkdirTemp err:%v", err.Error())
        return nil, err
    }
    defer os.RemoveAll(tempImageDir)

    // 使用ffmpeg截取关键帧并将图片放入指定目录
    /*
        -i tmpVideoFile.Name(): 指定输入文件为临时视频文件的名称。
        -vf select='eq(pict_type,I)',fps=1/intervalSeconds: 使用select滤镜选择关键帧并指定帧率为1/intervalSeconds,即每间隔intervalSeconds秒取一帧。
        filepath.Join(tempImageDir, "temp_%03d.jpg"): 指定输出的图片文件名的格式,temp_%03d.jpg表示输出文件名的格式为temp_001.jpg、temp_002.jpg等,%03d将会被替换成递增的数字序列。这里的 tempImageDir 是保存图片的临时目录。
    */
    cmd := exec.Command("ffmpeg", "-i", tmpVideoFile.Name(), "-vf", fmt.Sprintf("select='eq(pict_type,I)',fps=1/%d", intervalSeconds), filepath.Join(tempImageDir, "temp_%03d.jpg"))
    err = cmd.Run()
    if err != nil {
        Log.LogError("GetMp4ImagesIntervalSeconds exec.Command err:%v", err.Error())
        return nil, err
    }

    // 遍历临时图片目录,将图片文件名添加到切片中
    files, _ := filepath.Glob(filepath.Join(tempImageDir, "temp_*.jpg"))
    for _, fileName := range files {
        imageBase64, dhash, err := fileToBase64(fileName)
        if err != nil {
            Log.LogError("GetMp4ImagesIntervalSeconds fileToBase64(fileName) err:%v", err.Error())
            return nil, err
        }
        imageSlice = append(imageSlice, ImageInfo{
            ImageBase64: imageBase64,
            DHash:       dhash,
        })
        fmt.Println("dhash:", dhash)
    }
    Log.LogInfo("GetMp4ImagesIntervalSeconds success number:%v", len(imageSlice))
    return imageSlice, nil
}

代码说明

  • 视频数据处理通过base64.StdEncoding.DecodeString解码视频的Base64数据,得到视频的二进制流,并将其写入临时的MP4文件。

  • 创建临时目录创建两个临时目录:一个用于存储视频文件,另一个用于存储从视频中截取的图片文件。

  • 使用FFmpeg命令行截取视频关键帧通过exec.Command调用FFmpeg命令,参数-vf select='eq(pict_type,I)',fps=1/{intervalSeconds}表示选择I帧(关键帧)并按指定时间间隔截图。图片文件保存到临时图片目录中。

  • 返回截图结果截取的图片被保存为JPG格式,程序遍历图片文件夹并将每张图片转为Base64字符串,并生成ImageInfo结构体返回。

总结

本文介绍了如何在Go项目中集成并使用FFmpeg进行视频处理,特别是通过FFmpeg截取视频的关键帧并将其保存为图片。通过这种方式,可以非常方便地对视频进行快速分析和处理,适用于图像识别、视频内容分析等场景。希望对大家的项目开发有所帮助!

到此这篇关于Golang集成FFmpeg的音视频处理的实现的文章就介绍到这了,更多相关Golang FFmpeg音视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoFrame实现顺序性校验示例详解

    GoFrame实现顺序性校验示例详解

    这篇文章主要为大家介绍了GoFrame实现顺序性校验示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 利用golang和shell计算一个字符串的md5值

    利用golang和shell计算一个字符串的md5值

    这篇文章主要介绍了如何利用golang和shell计算一个字符串的md5值,我们先用shell来计算一下,再去判断golang计算的md5值是否正确,文中有详细的图文介绍,需要的朋友可以参考下
    2024-03-03
  • go swagger生成接口文档使用教程

    go swagger生成接口文档使用教程

    这篇文章主要为大家介绍了go swagger生成接口文档使用教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 一文带你使用Golang实现SSH客户端

    一文带你使用Golang实现SSH客户端

    SSH 全称为 Secure Shell,是一种用于安全地远程登录到网络上的其他计算机的网络协议,本文主要为大家详细介绍了如何使用 Golang 实现 SSH 客户端,需要的可以参考下
    2023-11-11
  • Go语言map元素的删除和清空

    Go语言map元素的删除和清空

    本文主要介绍了Go语言map元素的删除和清空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go正则表达式匹配字符串,替换字符串方式

    Go正则表达式匹配字符串,替换字符串方式

    介绍了Go语言中使用正则表达式进行字符串匹配和替换的方法,包括匹配单个子字符串和所有子字符串,个人经验分享,旨在为读者提供实用的编程技巧,并鼓励大家支持脚本之家
    2025-02-02
  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    这篇文章主要介绍了Golang 中 omitempty的作用,文章围绕主题展开详细的内容介绍,具有一定的参考一下,需要的小伙伴可以参考一下
    2022-07-07
  • Go语言输出函数使用详解

    Go语言输出函数使用详解

    这篇文章主要介绍了Go语言输出函数使用详解的相关资料,需要的朋友可以参考下
    2023-08-08
  • golang 手写贪吃蛇示例实现

    golang 手写贪吃蛇示例实现

    这篇文章主要为大家介绍了golang 手写贪吃蛇示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang标准库os/exec执行外部命令并获取其输出包代码示例

    Golang标准库os/exec执行外部命令并获取其输出包代码示例

    这篇文章主要为大家介绍了Golang标准库os/exec执行外部命令并获取其输出包代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论