
1) 背景:商业化视频需要在播放过程中准确插入广告并保证计费准确。
2) 目标:保证广告按需触发、避免缓存造成计费漏计或重复计费、支持SSAI/CSAI两种模式并能通过CDN日志核验账单。
3) 小结:本指南面向工程/运维/产品,提供落地配置与验证步骤。
1) 流程步骤概览:请求视频清单(manifest)→广告决策(ADS)返回VAST→插入点标注(SCTE-35/EXT-X-DATERANGE)→CDN或边缘拼接广告→客户端播放并上报事件。
2) 关键环节:ADS响应时间、CDN缓存策略、计费埋点的唯一ID传递与阻止缓存命中。
3) 验证点:观看行为与CDN日志的时间线对齐。
1) 缓存键(Cache Key)设置:在CDN上把播放清单(manifest)与广告决策相关的query参数(例如 adid、adsign、ts)加入Cache Key或强制不缓存ADS响应。
2) TTL 与 Cache-Control:对主内容使用较长TTL,对动态拼接后的播放清单和广告资源设置短TTL或no-cache。示例:Manifest返回头部加上 Cache-Control: private, max-age=5。
3) 具体操作(以某常见CDN为例):进入服务配置→自定义Cache Key→添加请求头 X-Ad-Decision 或 query 参数→保存并下发。下发后用curl验证:curl -I "https://cdn.example/vid.m3u8?adid=XXX"。
1) CSAI(客户端插入):客户端请求ADS并拿到VAST后本地播放和计费,上报直达计费端。CDN只缓存媒体片段,需保证片段URL包含唯一标识避免跨会话缓存。
2) SSAI(服务端插入/边缘插入):边缘或源端把广告拼接进manifest/片段,观看请求只到CDN,计费埋点需在服务端/边缘生成并上报。优点是防作弊和一致性,但需要解决缓存隔离问题。
3) 实操建议:CSAI在播放控制权在客户端且对缓存要求较低;SSAI要求在CDN配置上对拼接清单设置短TTL并记录每次拼接的唯一请求ID。
1) 标记插入点:在直播或点播流上用SCTE-35(或HLS的EXT-X-DATERANGE)标注splice点,ADS接收到splice请求返回VAST包含广告素材URL与监测URL。
2) 拼接实现(SSAI):服务端根据splice点把广告片段编码为与主内容相同的分片并调整manifest顺序;保证每个广告片段的URL带上唯一ad_req_id参数用于计费追踪。
3) 操作步骤:抓取主manifest→解析SCTE时间点→请求ADS并存储广告片段到对象存储→生成新的manifest(带ad_req_id)→下发给CDN并设置低TTL→校验播放端是否能播放并上报impression。
1) 事件序列:impression(首帧)→ firstQuartile → midpoint → thirdQuartile → complete。每个事件要有唯一的ad_impression_id与时间戳。
2) 上报路径:CSAI由客户端直接POST到计费API;SSAI由边缘在拼接时生成并触发POST到计费API或把事件写入消息队列(Kafka)。示例负载:{"ad_impression_id":"uuid","event":"impression","ts":162...,"player_id":"p123"}.
3) 防止重复计费:在计费端做去重逻辑(基于ad_impression_id),并结合CDN访问日志(request_id、edge_ts)做交叉验证。
1) 环境准备:确保CDN支持边缘计算(Edge Workers/Functions)或在源端做拼接。开通边缘函数并授权访问对象存储与ADS。
2) 实施步骤:a) 在边缘拦截manifest请求;b) 检查是否存在SCTE-35指示;c) 调用ADS获取广告素材并下载到临时缓存;d) 生成新的manifest并在URL中注入ad_req_id;e) 返回给播放器并上报impression事件。
3) 测试与回滚:先在测试域名下开启,使用curl和播放器回放检查manifest顺序、片段MD5及计费事件是否到达计费端。
1) 集成ADS请求:播放器在检测到播放到插入点(由manifest或服务端通知)时发起ADS请求并解析VAST。
2) 播放与上报:播放广告前生成ad_impression_id并在播放开始、25%、50%、75%、结束时分别上报事件到计费API,使用可靠上报(重试机制与持久化队列,以防断网)。
3) 保证缓存不影响:广告素材URL应加入防缓存参数(如 ?cache_bust={ts})或通过设置响应头禁止CDN长缓存。
1) 日志关联:统一使用request_id/ad_impression_id作为链路ID,把CDN访问日志、边缘日志、播放器上报日志和计费日志关联到同一个流水。
2) 对账步骤:a) 导出CDN原始请求日志(按时间段);b) 导出计费服务器的impression事件;c) 按ad_impression_id或request_id做左连接统计漏报/多报情况;d) 对异常条目抓取回放视频并人工比对。
3) 自动告警:设置阈值(如同一广告在1小时内重复曝光>3 次)触发告警并暂停涉事配置。
问题:当CDN缓存同一广告片段或拼接manifest时,可能导致不同用户看到相同ad_impression_id或计费事件不触发,我该如何避免?
回答:一是把ad_impression_id作为cache key的一部分或对拼接后的manifest/广告资源设置短TTL或no-cache,二是在广告URL里加入唯一会话参数(如 ad_req_id=UUID),三是在计费端做基于ad_impression_id的去重并用CDN日志校验实际请求时间窗口,从源头、CDN和计费端三层联动避免重复计费或漏计费。
问题:我需要在直播场景实现低延迟SSAI,如何在CDN上快速完成边缘拼接?
回答:建议使用支持边缘函数的CDN,在边缘函数中实时解析SCTE-35信号并调用ADS获取素材;将广告预热到边缘对象存储并用小分片(例如2s分片)减少拼接延迟;同时把manifest TTL设置为极短或使用Per-Request动态manifest生成,确保边缘能即时返回拼接结果并保持较低延迟。
问题:计费事件与实际播放行为有差异,如何高效进行核查?
回答:建立统一的链路ID(ad_impression_id/request_id),从播放器、边缘、CDN到计费系统都记录该ID并时间戳;导出各端日志做时间线比对,重点校验impression与首帧时间、quartile事件与片段偏移。对异常使用回放录像比对并结合CDN原始请求体(User-Agent、Range头)确认是缓存或播放失败导致的差异,从而定位并修正埋点或缓存策略。