WinUI3 MediaPlayer加载大视频时崩溃问题求助
WinUI3 MediaPlayer加载大视频崩溃及解码错误解决办法
问题概况
- 加载400MB左右的小视频运行正常,但加载5GB以上的GoPro视频直接崩溃,内存占用升至1.5GB后触发未处理Win32异常
- 原实现代码:
<MediaPlayerElement Source="E:\video.mp4" x:Name="mediaPlayer" AreTransportControlsEnabled="True"/>
- 改用
MediaSource.CreateFromStorageFile加载后出现解码错误,更新后的代码:
mediaPlayer.Source = MediaSource.CreateFromStorageFile(file); mediaPlayer.MediaPlayer.MediaFailed += MediaPlayer_MediaFailed; mediaPlayer.MediaPlayer.Play(); private void MediaPlayer_MediaFailed(Windows.Media.Playback.MediaPlayer sender, Windows.Media.Playback.MediaPlayerFailedEventArgs args) { Debug.WriteLine(args.Error); }
一、解决大视频加载崩溃问题
1. 强制启用流式加载,限制缓存大小
MediaPlayer默认会预加载大量视频数据到内存,大文件场景下直接导致内存溢出。给MediaSource设置缓存上限,强制采用流式加载模式:
var mediaSource = MediaSource.CreateFromStorageFile(file); // 设置缓存上限为100MB,可根据实际需求调整 mediaSource.AdvancedSettings.SetValue("StreamingCacheSizeLimit", 100 * 1024 * 1024); mediaPlayer.Source = mediaSource;
2. 关闭自动预加载,手动触发播放
避免程序启动时就加载全部视频内容,等用户主动触发播放再开始加载,降低初始内存占用:
mediaPlayer.MediaPlayer.AutoPlay = false; // 在播放按钮的点击事件中再执行播放逻辑 // mediaPlayer.MediaPlayer.Play();
二、修复解码错误
1. 强制使用软件解码
GoPro视频多采用H.265编码,部分系统可能缺少对应的硬件解码组件,尝试强制启用软件解码:
var mediaSource = MediaSource.CreateFromStorageFile(file); var playbackItem = new MediaPlaybackItem(mediaSource); var decoderSettings = new MediaDecoderSettings(); decoderSettings.VideoDecoderMode = MediaDecoderMode.ForceSoftware; playbackItem.VideoTracks.SetDecoderSettings(decoderSettings); mediaPlayer.MediaPlayer.Source = playbackItem;
2. 打印详细错误信息
原有错误日志过于简略,输出完整错误信息便于定位问题根源:
private void MediaPlayer_MediaFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args) { Debug.WriteLine($"错误代码:{args.Error}"); Debug.WriteLine($"错误描述:{args.ErrorMessage}"); Debug.WriteLine($"扩展错误代码:{args.ExtendedErrorCode}"); }
通过扩展错误代码可以精准排查是解码器缺失、编码格式不兼容还是其他底层问题。
三、额外优化提示
- 不要在UI线程初始化大文件的MediaSource,可通过后台线程完成初始化后,切回UI线程操作MediaPlayer
- 页面卸载时调用
mediaPlayer.MediaPlayer.Dispose(),及时释放资源避免内存泄漏
内容的提问来源于stack exchange,提问作者FrozenAssassine
相关产品推荐
相关产品推荐

