一共15种组合一下搞定;先伪代码没逻辑错误,然后就撸正式代码,后面测试就有点小顺利了
伪代码:
根据参数构造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
}
测试
4个滤镜全组合: 4+6+4+1 = 15种情况
四个全选
//音频+水印+文本+去水印 
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 实现混音,加水印,加文字,模糊水印任意滤镜组合相关推荐

  1. ffmpeg进行混音,将两路音频pcm数据合成一路输出

    ffmpeg进行混音,将两路音频pcm数据合成一路输出 audiomixer.h #ifndef AUDIOMIXER_H #define AUDIOMIXER_H#include <map&g ...

  2. ffmpeg pcm混音

    视频会议中经常需要处理的场景有多路音频混音,那么混音有很多种算法有比较主流的有归一权重.叠加均值.平均权重等方法:如果公司要开发生产级别的音频混合要的算法可能会更加多,可以找算法公司购买. ffmpe ...

  3. ffmpeg的amix混音改进

    ffmpeg af_amix混音改进 概述 af_amix介绍 af_amix不足 改进方法 概述 常见的混音算法是采用振幅乘以权值再求和,如下图所示,两路音频混音,a1, a2分别为源音频1和源音频 ...

  4. FL Studio音频混音教程

    FL Studio是一款音乐制作.编曲.混音软件,其内置众多电子合成音色,还支持第三方VST等格式插件.软件操作界面简洁易上手,即使你是零音乐基础小白,通过它也能轻松实现自己音乐梦想,很多人给他起了个 ...

  5. android视频叠加字符,手机上给视频加logo 安卓手机上给视频加摇摆的文字水印的方法...

    注意此教程方案是『安卓手机端教程方案』 如果在手机端操作不方便或对眼睛不好 也可以用另外电脑端的教程方案操作:视频加旋转水印[找更多方案] 今天要介绍安卓手机上视频编辑助手是可以给视频添加摇摆的文字水 ...

  6. TP5图片加水印(图片水印和文字水印)

    TP5使用加水印功能(加图片水印和文字水印) 由于项目需要图片加水印,正好使用TP5框架,下面记录一下使用方法: 1.安装扩展 使用Composer安装ThinkPHP5的图像处理类库: compos ...

  7. php怎么给视频加水印,视频怎么加水印 添加文字水印和图片水印 给视频加水印的软件...

    昨天由于台风"妮妲"来了深圳,所以在家休息了一天,而且势汹汹的台风"妮妲"于2日03时35分在深圳市大鹏半岛登陆,登陆时风力达到14级,成为近年来正面登陆珠江三 ...

  8. 【Audio】Unity音频模块:加载、转换、剪切、混音、合并

    GitHub项目:Epitome.Audio音频模块 WWW类外部加载音乐文件 使用delegate委托:音频加载完成进行回调 namespace Epitome {public delegate v ...

  9. 使用itext加图片水印或文字水印

    概述:使用itext 技术给pdf加水印方法. 实现原理:在不管是流还是临时pdf 预览之前.需先  生成不带水印的pdf,然后在通过itext工具方法生成带水印的pdf 依赖jar包:i-text- ...

最新文章

  1. 遍历百万级Redis的键值的续集
  2. 马云最新演讲:未来10年,人类将面临AI、IoT和区块链等三大技术巨大挑战!
  3. linux device注册
  4. 论文《Attention Is All You Need》及Transformer模型
  5. 方式四:修改模块导入段来拦截API
  6. WinAPI: midiOutReset - 重置输出设备
  7. groovy:gradle
  8. java web mvc_构建Java Web应用程序时遵循MVC的三个步骤
  9. Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)
  10. 第一代计算机主要用于科学计算和数据处理,计算机一级第一章练习题.doc
  11. 第16件事 愿景和目标要接地气
  12. 结构体,文件操作,指针,简单练习
  13. 清除stoped impdp/expdp job的方法
  14. Pyinstaller打包附带DLL、图标和压缩EXE方法
  15. 什么是网关,网关的作用
  16. 聚类算法:kmeans
  17. BatchNormalization 优点
  18. matlab里方差分析的盒子图怎么看,Matlab方差分析
  19. PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes—2017(笔记)
  20. 对视频声音,音频进行音量标准化和响度均化,归一化的标准,原理以及具体操作

热门文章

  1. 常用http请求解析
  2. 在hive如何创建数据库哦
  3. 期权最新高频行情数据
  4. SafetyNet Attestation API
  5. 3.3 费马质数测试
  6. 回溯算法(持续更新)
  7. java: 未报告的异常错误java.lang.IllegalAccessException; 必须对其进行捕获或声明以便抛出
  8. 机器学习进阶——数据清洗
  9. 计算机左侧没有桌面菜单栏,AI软件左侧的工具栏不见了没有了怎么显示出来
  10. 关于nomogram核心函数的time.inc函数的设定