ffmpeg添加片头和视频中间插入广告视频的实现过程

 xiezixing @ 2019-01-18 16:47:52

ffmpeg确实非常强大,可以做到非常多意想不到的功能,比如说合并视频、剪切视频,而今天我要讲的添加片头视频或者在视频中间任意时间轴添加广告视频,就是利用的ffmpeg的合并和剪切视频的功能。

我们先来思考下如果要添加片头的话,需要怎么做,前提是有一个视频文件和一个广告片头视频,然后就是讲广告片头视频合并进视频文件,添加片头的功能相对简单,就这两步就可以实现。但是,必须保证片头视频和所需要添加的视频格式和码率、分辨率都保持一致,这样才能保证合成的过程不会出错。

比如,我们拥有同样h264,aac编码的一个片头广告1.MP4,一个等待添加片头的视频文件2.mp4,两个视频的分辨率也一致,并且文件在同一个文件夹,例如存在于/home/user/movies,那么我们的命令行可以这样做。

ffmpeg -f concat -safe 0 -i <(for f in /home/user/movies/*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4

也许你也可以这样做:

ffmpeg -i "concat:1.mp4|input2.mp4" -c copy output.mp4

最终生成的视频就是合成之后的视频。

那么如果分辨率不同,编码也不同怎么办呢?那么可以进行一次判断之后,再根据情况将片头转码成和准备添加视频相同的分辨率和编码格式。

上边我们讲到了添加片头的实现过程,那么如果是要在视频中间指定时间轴位置添加一个视频广告又该怎么办呢?

我们只需要将视频剪切成两端,再将视频广告添加到这两端视频之间进行合成操作,就可以搞定在视频中间插入广告视频的效果。

我们同样假如有一个视频文件1.mp4,一个广告视频文件ad.mp4,我想在1.MP4视频文件的正中间时间轴位置添加一个视频广告,我们来看看到底要怎么做?

首先,我们通过ffprobe获取1.MP4的时长。

ffprobe -i 1.mp4

从返回的数据中可以看见:

  Duration: 00:02:21.33, start: 0.000000, bitrate: 1708 kb/s

也就是2分21秒,中间位置也就是1分11秒。

ffmpeg -ss 00:00:00 -i 1.mp4 -to 00:01:10 -c copy 11.mp4
ffmpeg -ss 00:01:11 -i 1.mp4 -to 00:02:21 -c copy 3.mp4

通过这两个命令,将源视频剪切成两半两段mp4文件,-ss放在-i前面会出现点小问题,就是视频合并之后可能会有些许重复的帧,但是如果添加了视频广告,重复1秒2秒也不是问题,这样做的好处是剪切非常快,如果想要精准剪切,可以将-ss放在-i后面。

最后我们来合并两段文件和视频广告文件:

ffmpeg -i "concat:11.mp4|ad.mp4|3.mp4" -c copy output.mp4

最后生成的mp4文件就是合成之后的视频文件。

添加片头和中间插入广告视频是不是都挺简单的,用代码实现进入WEBUI也不难,不过比较繁琐。