Flutter网络视频播放问题:video_player插件为何仅支持部分链接?
问题原因及解决方法
核心原因分析
- 明文HTTP限制:Android 9(API 28)及以上系统默认禁止APP发起明文HTTP请求,你的
http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4是HTTP协议,直接被系统拦截;而能正常播放的bee视频用的是HTTPS协议,不受这个限制。 - 视频编码兼容性(次要):虽然都是MP4格式,但视频的编码格式、码率、分辨率可能超出
video_player依赖的底层播放器(Android ExoPlayer、iOS AVPlayer)的支持范围。不过BigBuckBunny是通用测试视频,这种情况概率较低。 - CORS跨域限制(次要):部分HTTP服务器会设置CORS规则,拒绝非同源请求。如果你的APP域名和视频服务器域名不一致,可能被拦截,但HTTPS链接也可能存在这个问题,所以不是主要原因。
针对性解决方法
1. 允许明文HTTP请求(Android端)
全局允许所有HTTP请求
在Android项目的android/app/src/main/AndroidManifest.xml中,给<application>标签添加属性:
<application ... android:usesCleartextTraffic="true"> ... </application>
仅允许特定域名的HTTP请求(更安全)
在android/app/src/main/res/xml目录下新建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">commondatastorage.googleapis.com</domain> </domain-config> </network-security-config>
然后在AndroidManifest.xml的<application>标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
2. 验证视频编码兼容性
如果开启HTTP后还是无法播放,用FFmpeg查看视频编码信息:
ffmpeg -i http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4
确认编码是否为H.264(视频)+ AAC(音频)这类通用兼容格式。如果编码不支持,要么转码视频,要么更换支持该编码的播放器插件(比如基于video_player封装的chewie,核心还是依赖底层播放器)。
3. 处理CORS跨域问题(若存在)
如果服务器返回CORS相关错误,有两种解决思路:
- 后端代理:在自己的服务器上转发视频请求,APP请求自己的服务器(确保域名已配置CORS允许访问)。
- 修改服务器CORS规则:如果有权限,调整视频服务器的CORS设置,允许你的APP域名发起请求。
内容的提问来源于stack exchange,提问作者Ravi Taak
相关产品推荐
相关产品推荐

