Flutter iOS端无法加载S3存储视频 报错PlatformException(VideoError)
iOS端无法播放S3存储中自行拍摄上传视频的解决方案
你遇到的PlatformException(VideoError, Failed to load video: Cannot Open, null, null)报错属于iOS原生AVPlayer加载资源阶段的解析失败,结合仅自行拍摄上传的视频异常、官方示例视频正常、安卓全正常的特征,按优先级排查以下三个原因即可解决:
1. S3对象的Content-Type配置错误
iPhone原生AVPlayer对媒体资源的MIME类型校验比安卓严格很多,自行上传视频时如果没有手动指定Content-Type,S3会默认给资源设置application/octet-stream类型,这种类型会被iOS的AVPlayer判定为非可播放媒体资源直接拒绝加载,而安卓端的播放器校验宽松所以可以正常播放。
- 解决方法:上传视频到S3时手动指定视频文件的Content-Type为对应格式,MP4文件设置为
video/mp4,MOV文件设置为video/quicktime,修改已上传对象的元数据即可直接验证是否是该问题。
2. 视频元数据(moov原子)位置在文件尾部
iPhone本机拍摄的视频默认会把存储视频元信息的moov原子放在文件尾部,流式加载时播放器需要先拿到moov信息才能解码播放,安卓端可以缓冲完整个文件再读取moov,但iOS的AVPlayer要求moov必须在文件头部才能正常加载。
- 解决方法:上传前对视频进行预处理,把moov原子移动到文件头部,可使用ffmpeg命令处理:
ffmpeg -i 原视频路径.mp4 -movflags faststart 输出视频路径.mp4,处理后的视频再上传到S3即可正常播放。如果是iPhone拍摄的HEVC(H.265)编码视频,同步转码为H.264编码可兼容更多老旧iOS版本。
3. 依赖版本兼容问题
你使用的video_player: 0.2.5属于非常老旧的版本,该版本对iOS端的AVPlayer封装存在很多兼容缺陷,同时你使用的2.6.0-11.0.predev渠道Flutter本身也属于非稳定版本,两者搭配很容易出现版本兼容导致的加载异常。
- 解决方法:将video_player升级到2.2.x以上的稳定版本,同时切换到Flutter stable渠道的正式版本测试,排除版本兼容问题。
内容的提问来源于stack exchange,提问作者PetarA
相关产品推荐
相关产品推荐

