You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中ExoPlayer播放Firebase Storage存储的m3u8文件报错如何解决?

问题根因定位

你遇到的报错核心不是ExoPlayer适配问题或HLS格式错误,从错误日志可直接定位到根因:com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 403,属于资源访问权限被拒绝。
你能正常获取主.m3u8文件,是因为你传入播放器的链接携带了Firebase Storage要求的访问token;但Agora生成的HLS录制文件中,主.m3u8内引用的.ts分片文件路径为相对路径或不带token的绝对路径,ExoPlayer请求这些分片资源时未携带认证参数,因此触发403错误。

可落地解决方案
  • 方案1:开放直播录制目录的匿名读权限
    如果对直播回放的访问安全要求不高,可直接修改Firebase Storage规则,给存储HLS文件的目录配置公开读权限,规则示例如下:
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /streams/{allPaths=**} {
      allow read: if true;
      allow write: if request.auth != null;
    }
  }
}

配置完成后所有.ts分片无需token即可访问,无需修改播放侧代码即可正常播放。

  • 方案2:自定义播放器请求逻辑,统一追加认证参数
    如果不希望开放目录公开权限,可改造播放器的资源请求逻辑,给所有发往Firebase Storage的请求自动补充合法认证参数:
    Flutter侧可替换当前使用的video_player库,切换到支持自定义请求拦截的播放器库如better_player,配置拦截规则给所有.ts分片请求的URL拼接上有效访问token,或在请求头中携带Firebase认证凭证。

  • 方案3:录制完成后预处理m3u8文件,给分片路径补全token
    可在Agora录制完成的回调触发后,读取存储在Firebase中的主.m3u8文件,批量将文件内所有.ts分片路径拼接上长期有效的访问token,再将修改后的m3u8文件覆盖保存。该方案无需修改播放侧代码,但需要注意token有效期,避免到期后回放失效。

内容的提问来源于stack exchange,提问作者WBG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:15:04