分享推动进步
一位定居新西兰的自由码农

m3u8如何广告植入

前言
如果是内容提供商或者是做大做强的流量方,那么可以对视频内容进行运营。广告种类很多,承载的方式大多是图和视频。
如何往视频内容植入广告呢?假设我们往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份,然后自由组合投放策略,可以实时运营广告内容,按投放结果植入广告内容。

赞(2)
未经允许不得转载:慢工 » m3u8如何广告植入

评论 抢沙发