如题,这是一个关于跳过某些视频资源站非法广告的算法,支持引用hls.js播放器,m3u8文件播放时有效,已知问题,有闪屏现象
注意hls版本必须为这个<script src="
https://s4.zstatic.net/ajax/libs/hls.js/1.5.6/hls.min.js"></script>其余版本可能会无效,1.5.6以后的版本应该都可以
用法实例
<div id="dplayer"></div>
<script src="https://s4.zstatic.net/ajax/libs/hls.js/1.5.6/hls.min.js"></script>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/dplayer/1.26.0/DPlayer.min.js"></script>
<script>
// 自定义M3U8 Loader用于过滤广告
class CustomHlsJsLoader extends Hls.DefaultConfig.loader {
constructor(config) {
super(config);
const load = this.load.bind(this);
this.load = function(context, config, callbacks) {
// 拦截manifest和level请求
if (context.type === 'manifest' || context.type === 'level') {
const onSuccess = callbacks.onSuccess;
callbacks.onSuccess = function(response, stats, context) {
// 如果是m3u8文件,处理内容以移除广告分段
if (response.data && typeof response.data === 'string') {
// 过滤掉广告段 - 实现更精确的广告过滤逻辑
response.data = filterAdsFromM3U8(response.data, true);
}
return onSuccess(response, stats, context);
};
}
// 执行原始load方法
load(context, config, callbacks);
};
}
}
// M3U8清单广告过滤函数
function filterAdsFromM3U8(m3u8Content, strictMode = false) {
if (!m3u8Content) return '';
// 按行分割M3U8内容
const lines = m3u8Content.split('\n');
const filteredLines = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
// 只过滤#EXT-X-DISCONTINUITY标识
if (!line.includes('#EXT-X-DISCONTINUITY')) {
filteredLines.push(line);
}
}
return filteredLines.join('\n');
}
//此处为是否跳过广告开关
let adFilteringEnabled = true;
//hls配置文件
const hlsConfig = {
debug: false,
loader: adFilteringEnabled ? CustomHlsJsLoader : Hls.DefaultConfig.loader};
//切片广告跳过算法结束
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8',
type: 'hls',
},
pluginOptions: {
//集成广告过滤位置,主要是要引用hlsConfig
hls: hlsConfig,
},
});
</script>
替换前
替换后