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

