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音视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 3个Go语言中实用重构技术分享

    3个Go语言中实用重构技术分享

    代码重构是在不改变外部功能的情况下对现有代码进行改进,是编程的核心部分之一,本文为大家介绍了Go语言中3个实用重构技术,需要的可以参考一下
    2023-06-06
  • Linux环境下编译并运行go项目的全过程

    Linux环境下编译并运行go项目的全过程

    Go语言是Google的开源编程语言,广泛应用于云计算、分布式系统开发等领域,在Linux上也有大量的应用场景,这篇文章主要给大家介绍了关于Linux环境下编译并运行go项目的相关资料,需要的朋友可以参考下
    2023-11-11
  • Golang实现Java虚拟机之解析class文件详解

    Golang实现Java虚拟机之解析class文件详解

    这篇文章主要为大家详细介绍了Golang实现Java虚拟机之解析class文件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 一文带你吃透Golang中的类型转换

    一文带你吃透Golang中的类型转换

    Golang是一种强类型语言,所以Golang的类型转换和C/C++ java等语言的类型转换还有点区别,本文讲通过一些简单的示例带大家深入了解一下Golang中的类型转换,需要的可以参考下
    2023-05-05
  • Go语言中双Token登录系统的思路与实现详解

    Go语言中双Token登录系统的思路与实现详解

    在现代Web应用中,身份认证是保障系统安全的重要环节,本文将介绍如何使用Go语言实现双Token登录系统,文中的示例代码讲解详细,需要的可以了解下
    2025-07-07
  • golang redis中Pipeline通道的使用详解

    golang redis中Pipeline通道的使用详解

    本文主要介绍了golang redis中Pipeline通道的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go语言中占位符格式化符号的实现

    Go语言中占位符格式化符号的实现

    本文介绍了Go语言中常用格式化占位符,包括结构体、布尔、整数、浮点数、字符串、切片及指针类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10
  • go解析YAML文件(多文档解析)

    go解析YAML文件(多文档解析)

    本文介绍了如何使用GO语言和client-go库处理YAML文件,特别是在Kubernetes环境下,分析了YAML的特点,如简洁性、易读性、可嵌套性等,并展示了相关代码实现,包括单文档和多文档的处理方法,感兴趣的可以了解一下
    2024-10-10
  • GO CountMinSketch计数器(布隆过滤器思想的近似计数器)

    GO CountMinSketch计数器(布隆过滤器思想的近似计数器)

    这篇文章主要介绍了GO CountMinSketch计数器(布隆过滤器思想的近似计数器),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • go grpc高级用法

    go grpc高级用法

    RPC是远程过程调用,可以像调用本地服务一样取调用远程服务,本文主要介绍了go grpc高级用法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论