Android Java中ExoPlayer如何添加Referer请求头播放视频
ExoPlayer 配置Referer请求头播放防盗链HLS流方案
核心需求
- 播放目标HLS流:
https://reels2watch.com/hls/s1.m3u8 - 资源防盗链规则:请求必须携带值为
http://nbajunkie.xyz/jp1/的Referer请求头才可正常访问 - 目标:将Referer配置逻辑集成到现有ExoPlayer业务代码中
修改方法
不需要改动现有播放器的其他业务逻辑,只需要在初始化HTTP数据源工厂的位置加一行请求头配置即可,步骤如下:
- 找到代码中创建
DefaultHttpDataSource.Factory实例的位置 - 在实例创建完成后、生成
HlsMediaSource之前,调用设置请求头的方法传入要求的Referer值 - 保持后续播放器初始化、prepare、播放的逻辑不变即可
代码示例
修改前的典型无防盗链实现
// 原有未配置请求头的代码 ExoPlayer player = new ExoPlayer.Builder(context).build(); DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri("https://reels2watch.com/hls/s1.m3u8")); player.setMediaSource(hlsMediaSource); player.prepare(); player.play();
修改后的可用实现
// 新增Referer配置后的代码 ExoPlayer player = new ExoPlayer.Builder(context).build(); DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // 新增以下单行业务逻辑,配置防盗链要求的Referer头 dataSourceFactory.getDefaultRequestProperties().set("Referer", "http://nbajunkie.xyz/jp1/"); HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri("https://reels2watch.com/hls/s1.m3u8")); player.setMediaSource(hlsMediaSource); player.prepare(); player.play();
避坑说明
- Referer值必须和要求完全一致,末尾的
/不能省略,否则会触发防盗链拦截 - 如果你使用的是2.16以下版本的ExoPlayer,将代码中的
ExoPlayer替换为SimpleExoPlayer即可,请求头配置逻辑完全兼容 - 该配置对m3u8索引请求、分片ts请求都会生效,不需要单独给每个分片设置请求头
内容的提问来源于stack exchange,提问作者Nadeem Ahmad
相关产品推荐
相关产品推荐

