海外业务有视频拼接的需求,简单的说就是将两个视频拼接在一起形成新的视频(原视频+EC视频)。
调研后发现,视频拼接有如下方式:
1、单独使用ffmpeg的分离器:
concat (解码分离器之一,总概念是:demuxer)
(具体可以前往Wiki查看基础介绍篇:FFmpeg 音视频处理涉及的基础概念梳理。)
把所有要拼接的视频报存到一个文件中,然后利用ffmpeg的插件concat进行拼接。
方式如下:mylist.txt
file '/xxx/a.mp4'file '/xxx/b.mp4'
然后使用如下命令:
ffmpeg -f concat -i mylist.txt -c copy c.mp4
这种方式拼接速度最快,因为不涉及编码和解码,几乎只有文件的磁盘io操作。
然而,可以很负责任的告诉你,结果会出现问题:
-
文件时长不对!
对于文件时长出错的问题,可以换一种方式解决:先把ab视频转为ts格式,然后再同样进行拼接操作。
方式:
ffmpeg -i '/xxx/a.mp4' -codec copy -bsf:v h264_mp4toannexb '/xxx/a.ts' ffmpeg -i '/xxx/b.mp4' -codec copy -bsf:v h264_mp4toannexb '/xxx/b.ts'ffmpeg -f concat -i mylist.txt -c copy c.mp4
#-bsf 是比特流过滤器选项 查看其他用:
ffmpeg -bsfs
#官方推荐mp4转ts的时候 带上这个参数
-bsf:v h264_mp4toannexb #https://ffmpeg.org/ffmpeg-bitstream-filters.html
依样画葫芦,把 a.ts和b.ts都按前面的方式写入mylist.txt ,然后执行上面一样的命令。
然而,亲试结果依然会出现问题:
-
播放到衔接处花屏 (Quicktime 播放器)
此处出现一个新的概念:TS格式 这里简单的认识就是传输流(transport stream)格式
2、使用concat协议
方式:
ffmpeg -i "concat:/xxx/a.ts|/xxx/b.ts" -c copy c.mp4
注意这种方式是使用协议,作用层面也是在文件层,也不会导致编码和解码,所以速度也是很快。
然而,可以很负责任的告诉你, 结果依然很容易出现可能的问题:
-
播放到衔接处花屏 ÿ