FFMPEG 合并视频文件(无损)

作者: TAIS3 分类: 杂七杂八 发布时间: 2022-06-04 11:39

 

FFMPEG 合并视频文件(无损)

前言

最近在做视频转码相关业务,但是片源商给了一些DVD的零散视频片段,需要自己去合并片段并进行业务转码,本篇文章主要记录视频合并的过程及常见的合并方式。

环境

  • FFMPEG BUILDS 4.4.1

    FFmpeg Builds

  • 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.mp4input2.webminput3.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

发表回复