做一个基于ffmpeg的AI Agent智能体

做一个基于ffmpeg的AI Agent智能体

FFmpeg AI Agent:一条自然语言指令,实现一个简单音视频处理。

让用户说一句:音视频的处理要求,AI Agent帮你把活给做了。

实现比较简单,抛砖引玉,留下tools接口,可以无限扩展。

项目开源地址:

复制代码
https://github.com/runner365/gollmagent

1. 主要功能

支持连接多个大模型平台:

  • openai

  • yuanbao (腾讯)

  • qwen (阿里)

当前支持下面一些音视频处理功能:

  • 将多媒体文件提取音频, 转换为m4a格式

  • 将多媒体文件转换为mp4格式, 主要为视频文件,并显示进度

  • 合并多个多媒体文件为一个带有视频和音频的mp4文件

  • 合并多个多媒体文件的音频为一个纯音频的m4a文件

  • 给视频添加图片水印

  • 给视频添加文字水印

  • 给视频添加字幕

  • 基于视频的I帧生成图片

  • 在指定时刻截取视频帧

向大家推荐这本书《深入理解FFmpeg》,很多命令行都从这里借鉴而来。并且这本书后半部分讲解ffmpeg api的二次开发非常详细,显然是有丰富的ffmpeg api开发经验。

2. 如何使用

2.1 基础环境

  • golang开发环境

  • 安装ffmpeg:可以系统下运行ffmpeg命令行

  • 设置环境变量LLM_API_KEY:大模型的API_KEY,从各个大模型云厂商获取和配置你自己的API_KEY,个人测试过腾讯元宝大模型,阿里QWen大模型,OpenAI大模型

个人推荐腾讯元宝大模型,它的tools比较灵活,输入语句缺少参数信息,会有多轮对话自动提醒功能,国内的大模型网络也比较快。

环境ready后,

直接运行: go run gollmagent.go

系统启动一个对话命令行,可以与AI大模型继续聊天,来完成音视频处理任务。

下面给出一些通过与AI大模型聊天,来处理音视频文件的例子。

2.2 转码视频

直接向AI提问,要求转码一个视频文件,并指明分辨率

cpp 复制代码
用户: 请转码一个视频文件为360p,文件地址:D:\movies\src\wenjian.mp4

AI: 转码任务已启动,输出文件为 D:\movies\src\wenjian_360p.mp4,需要几分钟,请稍后。
AI:  当前进度: 7.27%,转码中,已耗时1125毫秒。
AI:  进度34.33%,转码中,已耗时5145毫秒。
AI:  进度58.13%,转码中,已耗时8650毫秒。
AI:  进度:84.95%,状态:转码中,耗时:12658毫秒
AI:  任务进度: 100.00%,转码已完成。

用户: 谢谢

AI: 不客气,有什么我可以帮你的吗?

转码完成后,可以得到一个自己想要分辨率的媒体文件。

2.3 合并多个视频

向AI提出要求,合并多个视频文件,给出文件列表。​​​​​​​

cpp 复制代码
用户: 合并多个视频文件,文件列表为: D:\movies\src\1.mp4, D:\movies\src\2.mp4, D:\movies\src\3.mp4

AI: 已合并视频文件,输出为 1_concat_2193.mp4。

合并完成后,AI告知合成后的媒体文件地址。

2.4 截取视频某个时刻的图片

向AI提出要求,截取某个视频某时刻一张图片​​​​​​​

cpp 复制代码
用户: 对视频文件D:\movies\src\2.mp4,在00:00:15截取一张图片

AI: 已截取视频帧,图片保存为2_screenshot_00_00_15.png

完成后,AI告知图片的地址。

2.5 获取视频所有IFrame的图片

向AI提出要求,截取某个视频中所有IFrame,并生成图片列表​​​​​​​

cpp 复制代码
用户: 对视频D:\movies\src\1.mp4的所有iframe截取图片

AI: 已从视频D:\movies\src\1.mp4提取I帧图片,保存在D:\movies\src\1_pics目录下。

完成后,AI会告诉图片的目录。目录下生成所有的iframe图片:

2.6 对视频文件加入图片水印

向AI提出要求,对某视频文件加入图片水印​​​​​​​

cpp 复制代码
用户: 对视频文件D:\movies\src\1.mp4添加水印:D:\movies\src\media_talk_Logo.png, 位置左上角

AI: 已为视频添加左上角水印,输出文件为1_watermarked.mp4。

AI生成新视频后,会告知新视频文件地址。

其他的一些功能(不再详细叙述):

  • 将多媒体文件提取音频, 转换为m4a格式

  • 合并多个多媒体文件的音频为一个纯音频的m4a文件

  • 给视频添加字幕

3. 扩展:动态添加新功能

AI Agent的tools功能,就是向大模型注册一个Tools列表,包含一些功能,功能映射的函数,函数需要的参数;

这里程序给出简单的注册新tools function接口,在llmproxy/tools.go中注册写的函数接口。

以注册一个图片截图功能为例。

第一步:向AI大模型注册功能,如下​​​​​​​

cpp 复制代码
func AddScreenshotAtMomentTool() *pub.ToolDefinition {
    screenshotAtMomentParams := map[string]interface{}{
        "type": "object",
        "properties": map[string]interface{}{
            "input_file": map[string]interface{}{
                "type":        "string",
                "description": "输入的视频文件路径",
            },
            "moment": map[string]interface{}{
                "type":        "string",
                "description": "截图时刻,格式为 HH:MM:SS",
            },
        },
        "required": []string{"input_file", "moment"},
    }
    tool := AddFunctionTool("screenshot_at_moment", "在指定时刻截取视频帧", screenshotAtMomentParams)
    return tool
}

func InitTools() string {
   //....
   FunctionTools = append(FunctionTools, AddScreenshotAtMomentTool())
   //...
}

第二步:实现"screenshot_at_moment"功能函数​​​​​​​

cpp 复制代码
func CreateFunctionToolsHandler() {
  //.....
  functions["screenshot_at_moment"] = ScreenshotOnePictureAtMoment
}

func ScreenshotOnePictureAtMoment(args map[string]interface{}) interface{} {
    inputFile, ok := args["input_file"].(string)
    if !ok {
        log.Errorf("invalid input_file arguments %+v", args)
        return "invalid input_file arguments"
    }
    moment, ok := args["moment"].(string)
    output := fmt.Sprintf("%s_screenshot_%02d_%02d_%02d.png", strings.TrimSuffix(filepath.Base(inputFile), filepath.Ext(inputFile)), hours, minutes, seconds)
    
    //do ffmpeg cmd job
    ffmpegcmd.ScreenshotOnePictureAtMoment(inputFile, moment, output)
    
    //返回图片文件
    return output_file    
}

只需要两步,就能注册一个新的AI Agent功能。

这个开源功能很简单,仅仅是抛砖引玉,如果有很多的想法,可以在评论区讨论。

相关推荐
锋行天下20 分钟前
Langgraph-cli 本地构建失败,改用服务器docker构建的流程
人工智能·前端框架·全栈
释厄62326 分钟前
群体投票双通道狭隘论——AI泡沫出清后的主角确权
人工智能
IT古董1 小时前
《Agent开发工程师成长指南》- 第4章 第2节:Prompt设计五要素——任务、角色、上下文、约束与输出格式
大数据·人工智能·prompt
霸道流氓气质1 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
孟健1 小时前
我把9个AI助理迁到了Grok Bot,连远程服务器都省了
人工智能·aigc·ai编程
AI+程序员在路上1 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
AI备案指南-满满2 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
这个DBA有点耶2 小时前
连拿六年第一后宣布出海:国产数据库凭什么敢撕掉“平替”的标签?
数据库·人工智能·架构
Jmyd01232 小时前
数字孪生校园ROI测算模型:成本收益参数化与敏感性分析方法
人工智能·数字孪生·三维数字化
IT_陈寒2 小时前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端