如何使用MediaPlaybackList实现UWP/WinUI 3无缝播放
MediaPlaybackList 无缝播放间隙问题解决方案
官方标注的无缝播放能力存在前置约束,直接使用MediaSource.CreateFromUri()加载远程托管文件出现切换间隙,按以下步骤排查修复即可:
- 优先校验媒体源文件合规性
无缝播放要求相邻播放项的媒体编码参数完全匹配:包含一致的音视频编码格式、音频采样率、视频分辨率、码率配置,且文件首尾不能存在编码器生成的静音帧、黑帧冗余数据。如果是自行切割的媒体分片,建议使用FFmpeg重新切片,强制分片点对齐关键帧,移除首尾冗余帧,超过半数的播放间隙本质是源文件本身自带间隔,和代码逻辑无关。 - 替换默认的Uri加载方式
直接通过MediaSource.CreateFromUri()生成的媒体源默认预加载策略非常保守,即便调整MaxPrefetchTime也不会触发远程资源的提前缓冲,自然没有效果。正确的加载逻辑为:- 实例化
HttpRandomAccessStream托管远程流读取,将流实例的ContentPrefetchTime与MediaPlaybackList.MaxPrefetchTime设置为相同值,推荐配置为2~3秒,过长的预取时间会额外占用带宽。 - 调用
MediaSource.CreateFromIRandomAccessStream()传入配置完成的流实例生成MediaSource,再绑定到对应的MediaPlaybackItem上加入播放列表。
- 实例化
- 关闭触发播放中断的非必要逻辑
监听MediaPlaybackList的ItemOpened事件,在每个播放项加载完成后,调用MediaPlaybackItem.GetDisplayProperties()方法,关闭自动拉取媒体元数据、自动更新系统媒体传输控件封面的选项,系统默认的元数据拉取、UI刷新逻辑会在切项时造成可感知的短暂停顿。 - 校验逻辑有效性
先将AutoRepeatEnabled设为false,使用本地存储的参数匹配的测试文件验证切换效果,如果本地文件切换依然存在间隙,直接排查源文件问题即可,无需反复调整代码参数。
注意:如果媒体资源需要动态携带鉴权头、或者存在加密逻辑,不能使用默认Uri加载方式,必须自定义实现
IRandomAccessStream处理请求逻辑与预缓冲,否则预取机制完全不会生效。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

