FFMPEG 实现混音,加水印,加文字,模糊水印任意滤镜组合
根据参数构造ffmpeg参数命令
构造元素视频方面有水印,文字,去水印;音频方面有混音一个
构造顺序: 先音频后视频 1:音频 2:水印 3:文字 4:去水印
伪代码
audioExist = false
videoExist = false
var filterPara string
var tailPara string
cmd += ffmpeg -loglevel verbose -i a.mp4
if(音频||水印||文字||去水印)filterPara += -filter_complex
if(音频)cmd += -i b.mp3filterPara += "[0:a][1:a]amix=inputs=2:duration=shortest:dropout_transition=2[a]"tailPara += '-map 0:v:0 -map "[a]"'audioExist = true
if(水印)cmd += -i c.jpgif(audioExist)filterPara += ;[2:v]scale=94:167[vv];[0:v][vv]overlay=102:102elsefilterPara += [1:v]scale=94:167[vv];[0:v][vv]overlay=102:102videoExist = true
if(文字)if(!audioExist&&!videoExist)filterPara += ""else if(videoExist)filterPara += ","else filterPara += ";"filterPara += ...videoExist = true
if(去水印)if(!audioExist&&!videoExist)filterPara += ""else if(videoExist)filterPara += ","else filterPara += ";"filterPara += ...
tailPara += -f mp4 -movflags faststart fileName.mp4 -ycmd += filterPara + tailPara
implemented with golang
func (modify *ModifyVideo) CombineCmd(taskid, mp4Url, audioUrl, outputFile string,imageLayer Imagelayers, delogo DelogoBody, txtLayer []Txtlayers) (ffmpegCmd, outputDir string) {if "" == mp4Url {return}_, err := os.Stat(logDir)if err == nil {fmt.Printf("mkdir logDir success\n")}if err != nil && os.IsNotExist(err) {err = os.MkdirAll(logDir, 0777)if err == nil {utils.Log.Debug("mkdir logDir success")} else {utils.Log.Debug("mkdir logDir failed")}}audioExist := falsevideoExist := falsevar filterPara stringvar tailPara stringffmpegCmd += "ffmpeg -loglevel verbose -i \"" + mp4Url + "\" "if audioUrl != "" || imageLayer.Src != "" || len(txtLayer) != 0 || delogo.Height != "" {filterPara += " -filter_complex \""}if audioUrl != "" {ffmpegCmd += " -i \"" + audioUrl + "\" "filterPara += "[0:a][1:a]amix=inputs=2:duration=shortest:dropout_transition=2[a]"tailPara += " -map 0:v:0 -map \"[a]\" "audioExist = true}if imageLayer.Src != "" {ffmpegCmd += " -i \"" + imageLayer.Src + "\" "filterPara += modify.combImageLayer(audioExist, imageLayer)log4plus.Debug("after imageLayer added: filter para is: %s", filterPara)videoExist = true}if len(txtLayer) != 0 {if !audioExist && !videoExist {filterPara += ""} else if videoExist {filterPara += ","} else {filterPara += ";"}filterPara += modify.combTxtLayer(txtLayer)log4plus.Debug("after txtLayer added: filter para is: %s", filterPara)videoExist = true}if delogo.Height != "" {if !audioExist && !videoExist {filterPara += ""} else if videoExist {filterPara += ","} else {filterPara += ";"}filterPara += modify.combDelogo(delogo)log4plus.Debug("after delogo added: filter para is: %s", filterPara)videoExist = true}//tail of filtergraph end with "filterPara += "\""//输出路径outputDir += "/modifyvideo/"curStamp := strconv.Itoa(int(time.Now().Unix()))outputDir += taskid + "/"outputDir += curStamperr = os.MkdirAll(outputFile+outputDir, 0777)if err == nil {fmt.Printf("makdir success\n")} else {fmt.Printf("makdir failed\n")}outputDir += "/"fileName, isValid := getFileName(mp4Url, curStamp)log4plus.Debug("isvalid:%t, fileName:%s", isValid, fileName)if isValid {outputDir += fileName} else {outputDir += "out_" + curStamp + ".mp4"}outputFile += outputDir_, err1 := os.Create(outputFile)if err1 == nil {fmt.Printf("create file success\n")} else {fmt.Printf("create file failed\n")}tailPara += " -f mp4 -movflags faststart "tailPara += outputFiletailPara += " -y " //overwrite parameterffmpegCmd += filterPara + tailParalog4plus.Debug("\ttailPara is %s\n\tffmpegCmd is %s", tailPara, ffmpegCmd)fflog := logDir + "/" + strconv.Itoa(logId) + "_" + strconv.Itoa(int(time.Now().Unix())) + ".log"logId++ffmpegCmd += " >" + fflog + " 2>&1"fmt.Println(ffmpegCmd)utils.Log.Debug("ffmpegCmd = " + ffmpegCmd)return
}
四个全选
//音频+水印+文本+去水印
curl -i -d '{"audiourl":"http://zxw-ybktest.chinacloudapp.cn/otvcloud_y1cc0ca0-f176-44d3-9d6c-d0634e71c5f6.mp3","cpid":"yz","mp4url":"http://183.131.106/lzy2214test.mp4","returl":"http://180.11.29.170:8880/backend-web/content/recReEditUrl.do","taskid":"1","imagelayers":{"height":"167","offsetX":"102","offsetY":"102","src":"http://13.131.159.21:1006/lzy/1522458959462-1522458959386_24_u=657178443,1345964771&fm=27&gp=0.jpg","width":"94"},"delogo":{"height":"20","offsetX":"10","offsetY":"10","width":"100"},"txtlayers":[{"fontColor":"#000000","fontSize":"14","offsetX":"305","offsetY":"277","text":"world"},{"fontColor":"#000000","fontSize":"14","offsetX":"100","offsetY":"100","text":"hello"}]}' http://183.11.19.27:8080/editvod
FFMPEG 实现混音,加水印,加文字,模糊水印任意滤镜组合相关推荐
- ffmpeg进行混音,将两路音频pcm数据合成一路输出
ffmpeg进行混音,将两路音频pcm数据合成一路输出 audiomixer.h #ifndef AUDIOMIXER_H #define AUDIOMIXER_H#include <map&g ...
- ffmpeg pcm混音
视频会议中经常需要处理的场景有多路音频混音,那么混音有很多种算法有比较主流的有归一权重.叠加均值.平均权重等方法:如果公司要开发生产级别的音频混合要的算法可能会更加多,可以找算法公司购买. ffmpe ...
- ffmpeg的amix混音改进
ffmpeg af_amix混音改进 概述 af_amix介绍 af_amix不足 改进方法 概述 常见的混音算法是采用振幅乘以权值再求和,如下图所示,两路音频混音,a1, a2分别为源音频1和源音频 ...
- FL Studio音频混音教程
FL Studio是一款音乐制作.编曲.混音软件,其内置众多电子合成音色,还支持第三方VST等格式插件.软件操作界面简洁易上手,即使你是零音乐基础小白,通过它也能轻松实现自己音乐梦想,很多人给他起了个 ...
- android视频叠加字符,手机上给视频加logo 安卓手机上给视频加摇摆的文字水印的方法...
注意此教程方案是『安卓手机端教程方案』 如果在手机端操作不方便或对眼睛不好 也可以用另外电脑端的教程方案操作:视频加旋转水印[找更多方案] 今天要介绍安卓手机上视频编辑助手是可以给视频添加摇摆的文字水 ...
- TP5图片加水印(图片水印和文字水印)
TP5使用加水印功能(加图片水印和文字水印) 由于项目需要图片加水印,正好使用TP5框架,下面记录一下使用方法: 1.安装扩展 使用Composer安装ThinkPHP5的图像处理类库: compos ...
- php怎么给视频加水印,视频怎么加水印 添加文字水印和图片水印 给视频加水印的软件...
昨天由于台风"妮妲"来了深圳,所以在家休息了一天,而且势汹汹的台风"妮妲"于2日03时35分在深圳市大鹏半岛登陆,登陆时风力达到14级,成为近年来正面登陆珠江三 ...
- 【Audio】Unity音频模块:加载、转换、剪切、混音、合并
GitHub项目:Epitome.Audio音频模块 WWW类外部加载音乐文件 使用delegate委托:音频加载完成进行回调 namespace Epitome {public delegate v ...
- 使用itext加图片水印或文字水印
概述:使用itext 技术给pdf加水印方法. 实现原理:在不管是流还是临时pdf 预览之前.需先 生成不带水印的pdf,然后在通过itext工具方法生成带水印的pdf 依赖jar包:i-text- ...
最新文章
- 遍历百万级Redis的键值的续集
- 马云最新演讲:未来10年,人类将面临AI、IoT和区块链等三大技术巨大挑战!
- linux device注册
- 论文《Attention Is All You Need》及Transformer模型
- 方式四:修改模块导入段来拦截API
- WinAPI: midiOutReset - 重置输出设备
- groovy:gradle
- java web mvc_构建Java Web应用程序时遵循MVC的三个步骤
- Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)
- 第一代计算机主要用于科学计算和数据处理,计算机一级第一章练习题.doc
- 第16件事 愿景和目标要接地气
- 结构体,文件操作,指针,简单练习
- 清除stoped impdp/expdp job的方法
- Pyinstaller打包附带DLL、图标和压缩EXE方法
- 什么是网关,网关的作用
- 聚类算法:kmeans
- BatchNormalization 优点
- matlab里方差分析的盒子图怎么看,Matlab方差分析
- PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes—2017(笔记)
- 对视频声音,音频进行音量标准化和响度均化,归一化的标准,原理以及具体操作