ffmpeg concat video and mix audio,ffmpeg简单快速的合并视频

2019-12-17 11:56:05

参考地址 ffmpeg concat video and mix audio

需求

将N个片段视频文件连接,并合并额外的音频文件

解决方案:

ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。

  • the concat "demuxer"

  • the concat "protocol"

对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..).
protocol只适用于少数集中容器格式。

使用concat demuxer连接视频文件

demuxer从一个文本文件中读取文件或者其他指令的列表,然后注意的对他们进行解复用。就像把他们的数据包混合到一起。

步骤:

1.创建一个文件mylist.txt,包含你想要连接的所有文件,格式如下:

file 'path/to/file1'
file 'path/to/file2'
file 'path/to/file3'

其中的文件路径可以是相对路径或者是绝对路径。

2.ffmpeg命令

ffmpeg -f concat -safe 0 -i mylist.txt -c copy output

如果对应的路径为相对路径 参数-safe 0就不是必须的。

3.自动生成输入文本文件的

可以使用如下shell脚本生成。

# with bash or zsh for loop
for f in *.mp4; do echo "file '$f'" >> mylist.txt; done
# or with printf
printf "file '%s'\n" *.mp4 > mylist.txt

使用Concat protocol 连接视频文件

demuxer 是在文件流级别工作,而cancat protocol则是在文件级别操作。
可以将使用MPEG-2传输流的文件连接在一起。类似于在类unix系统上使用cat,或在windows系统上使用copy.

1.下面的命令连接了三个MPEG-2 TS文件,并将它们连接在一起,但不进行重编码

ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts

2.使用中间文件

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

3.使用命名管道避免中间文件

mkfifo temp1 temp2
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null & \
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4

所有MPEG格式(MPEG-4 Part 10 / AVC, MPEG-4 Part 2, MPEG-2 Video, MPEG-1 Audio Layer II,
MPEG-2 Audio Layer III (MP3), MPEG-4 Part III (AAC)).都可以转换成MPEG-TS.但是其中的一些参数需要改变,比如-bsf比特流过滤器需要改变

合并音频和视频

默认情况下,ffmpeg只会处理一个音频流和一个视频流,

先给命令:

ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4

相关解释:

  • map 参数制指定了从哪一个输入流中映射到输出中。

  • 0:v:0 从第一个输出文件中取第一个视频流,1:a:0从第二个文件中取第一个音频流。 v/a参数不是必需的。
    但是如果输入文件中包含多个流,这样有助于消除歧义。

  • 如果你的音频流时长超过视频流,或者相反,你可以使用-shortest参数,使ffmpeg参数在处理到两个输入短的结束时结束。

  • -c copy 复制音频流和视频流,这意味着进程会处理的更快,并且质量也与之前一样。但是在添加一个wav音频到视频中时,最好先
    压缩一下音频。例如:
    ffmpeg -i input.mp4 -i input.wav -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k output.mp4
    命令中,我们复制了视频流,但是使用ffmpeg内置的AAC编码器重编码了音频,设置为了192kBit/s.

  • 如果你的输出并不支持特定的编解码器, 例如(添加WAV到MP4,或者AAC到AVI中)重编码也是需要的。

我的解决方案:

由于需要合并片段文件和相应的音频文件,首先会拆离视频文件中的音频文件, 并与另外的音频文件混合。可以使用sox或者ffmpeg

然后在执行连接命令。

命令如下:

ffmpeg -hide_banner -f concat -i list.txt -i if.mp3 -c:v copy -c:a aac -strict -2 -map 0:v:0 -map 1:a:0  test.mp4

参考资料:

  • 2018-08-07 20:00:42

    xUtils3.0版本的发送同步网络请求的方式

    对于Android开发来说,基本都是用异步来从网络上请求数据,很少用到同步请求的。近日项目有个地方需要使用到同步请求(以我目前的知识储备来说好像只能用同步请求来解决这个问题了),去网上搜索相关资料,又没有找到什么明确的使用方法。所以记下来,以备不时之需。

  • 2018-08-14 23:35:28

    Retrofit 设置 超时时间

    今天开发的时候遇到一个网络请求超时的问题,后台处理是成功的,但是移动端返回的总是提示请求超时,在设置了retrofit请求超时的时间延长以后,就可以请求成功了,下面是配置的方法:

  • 2018-08-16 16:10:43

    Laravel 跨域解决方案

    我们在用 laravel 进行开发的时候,特别是前后端完全分离的时候,由于前端项目运行在自己机器的指定端口(也可能是其他人的机器) , 例如 localhost:8000 , 而 laravel 程序又运行在另一个端口,这样就跨域了,而由于浏览器的同源策略,跨域请求是非法的。其实这个问题很好解决,只需要添加一个中间件就可以了。

  • 2018-08-18 20:30:12

    laravel5.5 路由分割成不同文件

    routes.php/api.php文件用来放置laravel路由,当项目越来越大,相应的路由文件也会越来越多。如果能够将不同功能的路由分割到不同的文件,那么对以后的维护将很有帮助。

  • 2018-08-20 15:26:19

    关于OnTouch 和OnClick同时调用冲突的解决方案

    大家在搞轮播图的时候会碰到这样的情况,点击进入webview界面,长按轮播图停止轮播,手松开图又开始轮播,这里就涉及到了OnTouch 和OnClick同时调用。两者是有冲突的。这里简单介绍,给大家提供思路。

  • 2018-08-20 15:29:11

    揭开RecyclerView的神秘面纱(二):处理RecyclerView的点击事件

    主要讲述了RecyclerView的基本使用方法,不同的布局管理器而造成的多样化展示方式,展示了数据之后,一般都会与用户进行交互,因此我们需要处理用户的点击事件。在ListView和GridView提供了onItemClickListener这个监听器,然而我们查找RecyclerView的API却没有类似的监听器,因此我们需要自己手动处理它的点击事件。 以下提供两种方法来实现处理RecyclerView点击事件的功能,以下代码均基于上一篇文章的代码做出修改。