Golang 给视频添加背景音乐 | Golang工具
目录
前言
环境依赖
代码
总结
前言
本文提供给视频添加背景音乐,一如既往的实用主义。
主要也是学习一下golang使用ffmpeg工具的方式。
环境依赖
ffmpeg环境安装,可以参考我的另一篇文章:windows ffmpeg安装部署_阿良的博客-CSDN博客
本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。
golang主要依赖库
github.com/u2takey/ffmpeg-go
代码
不废话,上代码。下面为功能实现的主要代码。
package mainimport (logutil "csdn/utils""fmt""github.com/gofrs/uuid""github.com/google/logger"ffmpeg "github.com/u2takey/ffmpeg-go""path/filepath""strings"
)func InFormat2(target string, str_array []string) bool {for _, element := range str_array {if target == element {return true}}return false
}//视频添加背景音
func AddBgm(inputVideoPath, inputAudioPath, outputDir string, duration int) string {_videoFormatArr := []string{"mp4", "flv"}_audioFormatArr := []string{"mp3"}_, _file := filepath.Split(inputVideoPath)_tmps := strings.Split(_file, ".")_videoExt := _tmps[len(_tmps)-1]if !InFormat2(_videoExt, _videoFormatArr) {logger.Fatal("视频格式不支持")}_, _file = filepath.Split(inputAudioPath)_tmps = strings.Split(_file, ".")_audioExt := _tmps[len(_tmps)-1]if !InFormat2(_audioExt, _audioFormatArr) {logger.Fatal("音频格式不支持")}_name, err := uuid.NewV4()if err != nil {logger.Fatal(err)}_resultVideoPath := filepath.Join(outputDir, fmt.Sprintf("%s.%s", _name.String(), _videoExt))err = ffmpeg.Input(inputAudioPath, ffmpeg.KwArgs{"i": inputVideoPath}).Output(_resultVideoPath, ffmpeg.KwArgs{"filter_complex": fmt.Sprintf("[1]volume=0.13[vo1];[vo1]aloop=loop=-1:size=2e+09[ao1];[ao1]atrim=0:%d[ap1];[ap1]adelay=0|0[a1];[a1][0:a]amix=2:dropout_transition=%d", duration, duration*100), "acodec": "aac", "ar": "48000", "ac": "1", "vcodec": "libx264", "profile:v": "baseline", "level": "3.1", "preset:v": "medium", "g": "30", "keyint_min": "30", "sc_threshold": "0"}).OverWriteOutput().ErrorToStdOut().Run()if err != nil {logger.Fatal(err)}return _resultVideoPath
}func main() {logutil.Init(true, false, "1.log")defer logutil.Close()_result := AddBgm("E:\\360MoveData\\Users\\xxx\\Desktop\\movie.mp4", "E:\\360MoveData\\Users\\xxx\\Desktop\\1.mp3", "E:\\360MoveData\\Users\\xxx\\Desktop", 300)fmt.Println(_result)
}
日志工具代码如下,非必要。
package logutilimport ("github.com/google/logger""os"
)var pLogger *logger.Logger// Init init logger
func Init(verbose, systemLog bool, logPath string) {file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0660)if err != nil {logger.Fatalf("logger Init: open log file(%v) error(%v)", logPath, err)}pLogger = logger.Init("FFmpegDemoLogger", verbose, systemLog, file)
}// Close close logger
func Close() {pLogger.Close()
}
代码说明
1、AddBgm方法参数分别为,输入视频地址、输入音频地址、输出目录地址、音频时长。
2、做了简单的视频格式校验,如需添加,可以自己看着来。
3、最终视频名使用uuid避免重复。
4、音频会在视频中循环,如果要选定一些时间区域出现背景音乐的话可以自行调整一下命令参数。
验证一下
准备的视频和背景音乐信息。
执行结果
2023/02/14 18:20:19 compiled command: ffmpeg -i E:\360MoveData\Users\huyi\Desktop\movie.mp4 -i E:\360MoveData\Users\huyi\Desktop\1.mp3 -ac 1 -acodec aac -ar 48000 -filter_complex [1]v
olume=0.13[vo1];[vo1]aloop=loop=-1:size=2e+09[ao1];[ao1]atrim=0:300[ap1];[ap1]adelay=0|0[a1];[a1][0:a]amix=2:dropout_transition=30000 -g 30 -keyint_min 30 -level 3.1 -preset:v medium
-profile:v baseline -sc_threshold 0 -vcodec libx264 E:\360MoveData\Users\huyi\Desktop\5c389bbe-f531-440e-8e87-c0cbddae5da7.mp4 -y
ffmpeg version n4.3.1-20-g8a2acdc6da Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.3-win32 (GCC) 20200320
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enabl
e-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvmaf --dis
able-vulkan --enable-libvorbis --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-ffnvcodec --enable-cuda-llvm --disable-libglslang --enable-libass --enable-lib
bluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenj
peg --enable-librav1e --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libtwolame --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --ena
ble-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-libs=-lgomp
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'E:\360MoveData\Users\huyi\Desktop\movie.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Duration: 00:05:00.18, start: 0.000000, bitrate: 2447 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2321 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 120 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #1, mp3, from 'E:\360MoveData\Users\huyi\Desktop\1.mp3':
Metadata:
time_reference : 0
creation_time : 2023-01-17T04:11:04.000000Z
encoder : Lavf59.34.101
date : 2022-01-12
Duration: 00:00:10.25, start: 0.023021, bitrate: 320 kb/s
Stream #1:0: Audio: mp3, 48000 Hz, mono, fltp, 320 kb/s
Stream mapping:
Stream #0:1 (aac) -> amix:input1 (graph 0)
Stream #1:0 (mp3float) -> volume (graph 0)
amix (graph 0) -> Stream #0:0 (aac)
Stream #0:0 -> #0:1 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0000015d0ccfb840] using SAR=1/1
[libx264 @ 0000015d0ccfb840] frame MB size (120x68) > level limit (3600)
[libx264 @ 0000015d0ccfb840] MB rate (195644) > level limit (108000)
[libx264 @ 0000015d0ccfb840] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0000015d0ccfb840] profile Constrained Baseline, level 3.1, 4:2:0, 8-bit
[libx264 @ 0000015d0ccfb840] 264 - core 161 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=0 ref=2 deblock=1:0:0 analyse=0x1:0x111
me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=9 lookahead_threads=1 sliced
_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=30 keyint_min=16 scenecut=0 intra_refresh=0 rc_lookahead=30 rc=crf mbtree=1 crf=
23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'E:\360MoveData\Users\huyi\Desktop\5c389bbe-f531-440e-8e87-c0cbddae5da7.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Stream #0:0: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 69 kb/s (default)
Metadata:
encoder : Lavc58.91.100 aac
Stream #0:1(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc58.91.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame= 7197 fps= 80 q=-1.0 Lsize= 136079kB time=00:05:00.13 bitrate=3714.2kbits/s speed=3.35x
video:133403kB audio:2527kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.109709%
[aac @ 0000015d0c66eb80] Qavg: 1648.401
[libx264 @ 0000015d0ccfb840] frame I:240 Avg QP:15.95 size:145845
[libx264 @ 0000015d0ccfb840] frame P:6957 Avg QP:19.64 size: 14604
[libx264 @ 0000015d0ccfb840] mb I I16..4: 43.8% 0.0% 56.2%
[libx264 @ 0000015d0ccfb840] mb P I16..4: 4.8% 0.0% 1.1% P16..4: 28.3% 5.8% 1.6% 0.0% 0.0% skip:58.4%
[libx264 @ 0000015d0ccfb840] coded y,uvDC,uvAC intra: 28.9% 51.9% 14.9% inter: 6.0% 15.3% 0.1%
[libx264 @ 0000015d0ccfb840] i16 v,h,dc,p: 47% 23% 15% 15%
[libx264 @ 0000015d0ccfb840] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 22% 18% 6% 8% 5% 7% 5% 6%
[libx264 @ 0000015d0ccfb840] i8c dc,h,v,p: 61% 18% 17% 4%
[libx264 @ 0000015d0ccfb840] ref P L0: 77.2% 22.8%
[libx264 @ 0000015d0ccfb840] kb/s:3640.66
E:\360MoveData\Users\huyi\Desktop\5c389bbe-f531-440e-8e87-c0cbddae5da7.mp4
结果视频信息
总结
没啥好总结的,正好用到了就分享下,大家用的时候看着改。
分享:
想要永恒的人会看天空,想要瞬间的人会看云朵。
如果本文对你有帮助的话,点个赞吧,谢谢!

相关文章:
Golang 给视频添加背景音乐 | Golang工具
目录 前言 环境依赖 代码 总结 前言 本文提供给视频添加背景音乐,一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装,可以参考我的另一篇文章:windows ffmpeg安装部署_阿良的博客-CSDN博客 …...
让AI护理医疗:解决卫生系统的痛点
一、引言 1.对医疗领域中AI技术的介绍 随着人工智能的不断发展,它已经成为了各个领域中的重要组成部分。在医疗领域中,AI技术也逐渐发挥着越来越重要的作用。从诊断到治疗,从健康管理到研究,人工智能已经深刻地影响着医疗领域的…...
Windows 离线安装 MySQL 8
目录 1. 下载离线安装包 2. 上传解压 3 配置 my.ini 文件 4 设置系统环境变量 5 安装 MySQL 6 登录 MySQL 客户环境是内网环境,不能访问外网,只能离线安装 MySQL 了。 1. 下载离线安装包 MySQL 离线压缩包官网下载地址:MySQL :: Down…...
【前端攻城狮之vue基础】02路由+嵌套路由+路由query/params传参+路由props配置+replace属性+编程式路由导航+缓存路由组件
路由的基础知识1.路由简介2.路由基本使用3.嵌套路由4.传递路由的query传参# 5.传递路由的params参数6.路由的props传参配置7.路由router-link标签的replace属性8.编程式路由导航9.缓存路由组件1.路由简介 路由是一条条对应的key-value关系,key就是前端地址栏的路径…...
CHAPTER 1 Zabbix介绍及安装
Zabbix介绍及安装1.1 Zabbix监控1 为什么要监控1.1 网站可用性2 监控什么东西2.1 监控范畴3 怎么来监控3.1 远程管理服务器3.2 监控硬件3.3 查看cpu相关3.4 内存3.5 磁盘3.6 监控网络4 监控工具总览5 zabbix介绍5.1 zabbix的组成5.2 zabbix监控范畴1.2 安装zabbix1 环境检查2 安…...
认识V模型、W模型、H模型
软件测试与软件工程息息相关,软件测试是软件工程组成中不可或缺的一部分。 在软件工程、项目管理、质量管理得到规范化应用的企业,软件测试也会进行得比较顺利,软件测试发挥的价值也会更大。 要关注软件工程、质量管理以及配置管理与软件测试…...
excel ttest检测
1、excel函数含义 TTEST(array1,array2,tails,type) ▪ Array1: 第一组数据集 ▪ Array2: 第二组数据集 ▪ Tails: 用于定义所返回的分布的尾数: 1 代表单尾;2 代表双尾 ▪ Type: 用于定义 t-检验的类型: 1 代表成对检验;2 代表双样本等方差假设&am…...
PDFPrinting.Net操作进行细粒度控制
PDFPrinting.Net操作进行细粒度控制 PDFPrinting.Net能够容易且灵活地预测完美的打印结果以及用户文件的示例性显示。可以快速浏览.NET PDF打印中最关键的元素。如果用户需要获得更详细的概述,那么他可以查看快速入门手册,甚至是现有文档的详细概述参考。…...
SegPGD
在这项工作中,我们提出了一种有效和高效的分割攻击方法,称为SegPGD。此外,我们还提供了收敛性分析,表明在相同次数的攻击迭代下,所提出的SegPGD可以创建比PGD更有效的对抗示例。此外,我们建议应用我们的Seg…...
ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门
ESP-IDF Vscode ESP32 开发环境搭建以及开发入门 文章目录ESP-IDF Vscode ESP32 开发环境搭建以及开发入门1. 前言2. 下载开发工具3. 配置工具4. 创建工程5. 解决vscode找不到头文件,波浪线警告6. 添加自己的组件6.1 组件说明6.2 添加项目组件6.3 添加扩展组件7. …...
SpringMvc的请求和响应
SpringMvc的数据响应 1.springmvc的数据相应方式 (1)页面跳转 直接返回字符串 通过ModelAndView对象返回 (2)回写数据 直接返回字符串 返回对象或集合 页面跳转 jsp页面 <% page contentType"text/html;charsetUTF-8&q…...
【Vue3】首页主体-面板组件封装
首页主体-面板组件封装 新鲜好物、人气推荐俩个模块的布局结构上非常类似,我们可以抽离出一个通用的面板组件来进行复用 目标:封装一个通用的面板组件 思路分析 图中标出的四个部分都是可能会发生变化的,需要我们定义为可配置主标题和副标题…...
部署 K8s 集群
1 .部署k8s的两种方式目前生产部署Kubernetes集群主要有两种方式:kubeadmKubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。二进制包从github下载发行版的二进制包,手动部署每个组件&#x…...
关于北京君正:带ANC的2K网络摄像头用户案例
如果远程办公是您的未来,或者您经常通过视频通话与远方的朋友和亲戚交谈,那么您可以考虑购买网络摄像头以显著改善您的沟通。Anker PowerConf C200是个不错的选择。 Anker PowerConf C200专为个人工作空间而设计,能够以每秒30帧的速度拍摄2K…...
ccc-Backpropagation-李宏毅(7)
文章目录NotationBackpropagationForward passBackward passSummaryNotation 神经网络求解最优化Loss function时参数非常多,反向传播使用链式求导的方式提升计算梯度向量时的效率,链式法则如下: Backpropagation 损失函数计算为所有样本…...
找出字符串中第一个匹配项的下标-力扣28-java
一、题目描述给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。示例 1:输入:hayst…...
SpringBoot 监听Redis key过期回调
SpringBoot 监听Redis key过期回调 场景 Spring boot实现监听Redis key失效事件可应对某些场景例如:处理订单过期自动取消、用户会员到期… 开启Redis键过期回调通知 Redis默认是没有开启键过期监听功能的,需要手动在配置文件中修改。Linux操作系统 修…...
蓝桥杯C/C++VIP试题每日一练之回形取数
💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...
四控、三管、一协调
四控指的是进度控制,质量控制,成本控制,变更控制。三管指的是合同管理,安全管理,资料管理。一协调指的是协调甲方,总包及设备材料供应方的关系。信息系统工程监理是指依法设立且具备相应资质的信息系统工程…...
jdk19下载与安装教程(win10)超详细
一、下载安装步骤 1、官网下载还需要注册,可以点【我的网盘】目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序,点击【运行】。这里我使用的是64位的。 3、点击【下一步】。 4、默认安…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
