Flutter video_player在iOS(AVFoundation)播放HLS流时分辨率异常偏低的问题求助
各位好,我最近做Flutter视频播放功能时碰到了一个iOS端的奇怪问题,想请大家帮忙分析排查下:
我用Flutter官方的video_player组件播放GCORE提供的HLS(m3u8)自适应流,Android端表现堪称完美,会自动匹配合适的高分辨率码率;但到了iOS端,播放器却一直固执地选择低分辨率的 rendition,完全搞不懂原因出在哪。
核心代码片段
这是我实现播放器的关键代码:
late final VideoPlayerController _controller; @override void initState() { super.initState(); _initController(); } void _initController() async { _controller = VideoPlayerController.networkUrl( Uri.parse(url), formatHint: VideoFormat.hls, ); await _controller.setLooping(true); await _controller.initialize(); _initialized = true; setState(() {}); } @override Widget build(BuildContext context) { if (!_initialized && widget.placeholder != null) { return widget.placeholder!; } Widget videoWidget = VideoPlayer(_controller); return widget.builder( context, videoWidget, _controller, ); }
HLS主播放列表内容
我的GCORE生成的主m3u8内容如下,明确包含1080P、720P等多个高分辨率选项:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3090000,RESOLUTION=1080x1920,FRAME-RATE=30.010,CODECS="avc1.640028,mp4a.40.2"
cmaf-index-s0q3567v1-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1928000,RESOLUTION=720x1280,FRAME-RATE=30.010,CODECS="avc1.640020,mp4a.40.2"
cmaf-index-s0q3570v1-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=928000,RESOLUTION=468x832,FRAME-RATE=30.010,CODECS="avc1.4d401f,mp4a.40.2"
cmaf-index-s0q3573v1-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=514000,RESOLUTION=360x640,FRAME-RATE=30.010,CODECS="avc1.42c01e,mp4a.40.2"
cmaf-index-s0q3576v1-v1-a1.m3u8
已做的排查尝试
我已经做了不少排查,排除了一些可能的原因:
- 两台测试设备都是物理机,连接的是同一个90Mbps的WiFi,网络带宽绝对足够
- 试过多个第三方Flutter播放器(
better_player、better_player_plus、awesome_player),结果完全一致——毕竟它们iOS端底层都是基于AVFoundation - 直接使用最高分辨率的子播放列表URL播放时,iOS端能流畅加载1080P视频,没有任何缓冲或卡顿,说明流本身的高分辨率内容是正常可用的
- 查了相关资料,知道AVFoundation没有直接指定码率的API,只能设置最大码率和分辨率,但疑惑的是像Instagram、TikTok这类APP在iOS上都能正常选择高分辨率HLS流,肯定存在优化的空间
我的诉求
我不想放弃HLS的自适应码率切换功能,不想硬编码固定使用高分辨率子流,想请教大家:有没有办法让iOS端的AVFoundation(或者Flutter层的播放器配置)更积极地选择高分辨率的码率?有没有什么我忽略的配置项或者底层机制?
内容来源于stack exchange

