FFMPEG 合并视频文件(无损)
FFMPEG 合并视频文件(无损)
前言
最近在做视频转码相关业务,但是片源商给了一些DVD的零散视频片段,需要自己去合并片段并进行业务转码,本篇文章主要记录视频合并的过程及常见的合并方式。
环境
- FFMPEG BUILDS 4.4.1
- GeForce GTX 1060(NVIDIA)
- windows 10
- OVB格式视频文件
VTS_01_1.VOB
VTS_01_2.VOB
VTS_01_3.VOB
VTS_01_4.VOB
VTS_01_5.VOB
视频合并方式
concat 分离器
新建 merge.txt
file 'VTS_01_1.VOB'
file 'VTS_01_2.VOB'
file 'VTS_01_3.VOB'
file 'VTS_01_4.VOB'
file 'VTS_01_5.VOB'
合并视频文件
ffmpeg -f concat -safe 0 -i merge.txt -c copy vts.mp4
PS:如果使用的是相对路径可以不加
-safe 0
文件列表生成技巧
如果视频文件过多,merge.txt
复制很繁琐,所以可以使用命令来快速生成文件列表文件。
windows
(for %i in (*.VOB) do @echo file '%i') > merge.txt
PS:*.VOB 代表视频文件后缀。
linux
# bash
for f in *.wav; do echo "file '$f'" >> merge.txt; done
# printf
printf "file '%s'n" *.wav > merge.txt
concat 协议
缺点
这种方式使用范围比较小,只适合MPEG
等视频格式;
合并视频
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy merge.ts
拓展
如果是其他格式文件,则可以先转码在合并,例如
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 -movflags +faststart output.mp4
PS:
-movflags
+faststart
使用这两个属性生成的文件可以边下边看。
concat 过滤器(有损)
说明
过滤器适用于同步视频和音频流的段。所有段都必须具有相同数量的每种类型的流,并且也将是输出时的流数。
合并视频
ffmpeg -i input1.mp4 -i input2.webm -i input3.mov
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]"
-map "[outv]" -map "[outa]" output.mkv
PS:输入流有三个,分别是
input1.mp4
、input2.webm
和input3.mov
,然后告诉ffmpeg取出视频中的视频流及音频流,使用concat过滤器,告知它有三个视频流,他们都分别有一个视频流及一个音频流,连接并产生新的视频流[outv]及音频流[outa],然后映射新的视频流及音频流到新的文件output.mkv
。
总结
以上就是使用FFMPEG合并视频的方式及过程,各种方式各有利弊,推荐 concat分离器
> concat协议
> concat过滤器
,不能说哪种方式最好,只能根据实际情况来选择,如果大家有更好的方式或者建议,欢迎讨论。
文章来源于互联网:FFMPEG 合并视频文件(无损)
另外再记录一下直接ffmpeg下载并合并M38U的方法:
ffmpeg -i 视频地址 [输出的文件名.mp4]
例如:ffmpeg -i https://j-island.net/xxxxxx/001.m3u8 /Users/用户名/Downloads/xx.mp4