Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang FFmpeg音视频

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

作者:Yy_Yyyyy_zz

FFmpeg是一个开源的音视频处理工具,广泛用于视频转换、截图、处理和流媒体推送等操作,本文主要介绍了Golang集成FFmpeg的音视频处理的实现,具有一定的参考价值,感兴趣的可以了解一下

概述

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

使用步骤

FFmpeg常用指令

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

关键帧截取逻辑代码实现

接下来,我们将详细解释一个基于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
}

代码说明

总结

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

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

您可能感兴趣的文章:
阅读全文