前言
如果是内容提供商或者是做大做强的流量方,那么可以对视频内容进行运营。广告种类很多,承载的方式大多是图和视频。
如何往视频内容植入广告呢?假设我们往mp4视频源植入视频广告,我们可以采用两段视频concat的方式。但是这个有什么弊端呢?就是广告植入是固定的,如果是多变参数的视频源,那么需要进行重复操作,oss/cos存储也需要多份。在极大增加成本的同时,也没办法运营,既不能实时运营,也不能按用户运营。
基于这些考虑,我们选用m3u8文件格式进行技术开发。参考《第五篇、保护视频安全的手段》我们将视频文件进行ts切片,输出了固定时间长度的ts格式切片序列。
广告视频处理
我们进行广告植入,首先要处理的就是将广告视频转换成适合m3u8文件描述播放文件序列的ts文件。ffmpeg -i xxx.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb ad.ts
以上命令可以将输入视频直接转换成适配m3u8的ts文件格式。这里省略了其他的视频处理参数,包括编码、分辨率、码率、帧率这些。这里还有几个问题需要关心。
ad.ts的播放时长
ad.ts的转码参数
在m3u8文件通过#EXT-X-TARGETDURATION:2
约束每个切片的最大时间长度。这里表示每个切片文件最大是2秒钟。也需要尽量保证每个ts编码格式是一致的。
对原视频处理
参考《第五篇、保护视频安全的手段》的m3u8文件格式如下:
EXTM3U
EXT-X-VERSION:3
EXT-X-TARGETDURATION:2
EXT-X-MEDIA-SEQUENCE:0
EXT-X-PLAYLIST-TYPE:VOD
EXT-X-ALLOW-CACHE:NO
EXT-X-DISCONTINUITY-SEQUENCE:0
EXTINF:2.033333,
out_ts0.ts
EXTINF:1.966667,
out_ts1.ts
EXTINF:2.000000,
out_ts2.ts
…
EXT-X-ENDLIST
可以看到m3u8文件格式比较固定,通过#EXTINF:2.033333开始描述1个ts文件,2.033333表示接下来ts文件时间长度,out_ts0.ts指向当前目录文件。通过#EXT-X-ENDLIST表示m3u8文件播放完成。
从本质上m3u8就是文本格式的描述文件,我们在播放器请求m3u8播放源的时候拦截,插入广告ts序列后再返回给客户端即可以完成广告植入。编辑修改后的m3u8格式如下:
EXTM3U
EXT-X-VERSION:3
EXT-X-TARGETDURATION:2
EXT-X-MEDIA-SEQUENCE:0
EXT-X-PLAYLIST-TYPE:VOD
EXT-X-ALLOW-CACHE:NO
EXT-X-DISCONTINUITY-SEQUENCE:0
EXTINF:26.810000,
ad.ts
EXTINF:2.033333,
out_ts0.ts
EXTINF:1.966667,
out_ts1.ts
EXTINF:2.000000,
out_ts2.ts
…
EXT-X-ENDLIST
如果ad.ts文件太大,会影响视频播放延迟,我们应该针对ad.ts文件进行切片,最好与实际对原视频切片参数保持一致,再按照上述方式植入到m3u8文件中。既保证了播放速度,也完成了视频广告植入。
注意#EXT-X-ALLOW-CACHE:NO
参数表示当前m3u8文件不缓存本地,保障广告植入及时更新。
ad.ts和原视频ts解码参数不同,需要引入#EXT-X-DISCONTINUITY-SEQUENCE:0
和#EXT-X-DISCONTINUITY
描述,表示前后ts采用不同的解码器参数进行解码播放。
注意播放器需要响应广告播放跳过逻辑,业务上需要对广告内容进行返回。
结论
采用上述方式对原视频植入视频广告,广告视频和原视频只需要存储1份,然后自由组合投放策略,可以实时运营广告内容,按投放结果植入广告内容。