Flutter Chewie播放GCP存储桶视频报404但Chrome可正常播放
针对你遇到的Chewie播放视频返回exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 404错误,给出以下排查和解决方向:
检查存储桶视频的访问权限
GCP存储桶默认是私有访问,Chrome和VLC能播放大概率是因为你的本地环境(比如浏览器登录了GCP账号、VLC通过系统凭证授权)已经具备访问权限,但Chewie/ExoPlayer是直接发起HTTP请求,没有携带这些凭证,所以返回404。
解决方式:要么将该视频对象设置为公开可读(适合非敏感内容),要么生成带签名的临时访问URL(有效期内可直接访问,适合敏感内容)。验证视频URL的正确性
确认你使用的URL是GCP存储桶提供的HTTP/HTTPS访问地址,而非gs://协议地址——ExoPlayer不直接支持gs://协议,必须转换成可公开访问的HTTP格式(比如https://storage.googleapis.com/[bucket-name]/[video-path])。另外检查URL中是否有特殊字符(比如空格、中文)未做URL转义,这也可能导致请求路径错误返回404。自定义HttpDataSource的User-Agent
部分存储服务会验证请求的User-Agent,ExoPlayer默认的UA和Chrome、VLC不同,可能被拦截返回404。你可以修改Chewie示例代码中的ExoPlayer配置,自定义UA:val dataSourceFactory = DefaultHttpDataSource.Factory() .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(yourVideoUrl))排查设备网络环境
确认测试设备的网络是否能正常访问GCP存储服务,比如是否处于限制外网的环境(如公司内网),而Chrome能访问是因为走了系统代理,但App未配置代理。可以尝试用设备的浏览器直接打开视频URL,看是否能正常加载——如果浏览器也打不开,那就是网络或权限问题。
正如Jar-Jar所说:“任何帮助都很受欢迎”
内容的提问来源于stack exchange,提问作者scottstoll2017

