UWP图片转视频Win11预览报错:0xC00D36B4及内存不足
UWP MediaComposition预览在Windows 11中偶发异常的解决方案
针对你遇到的Win11中MediaComposition预览偶发0xC00D36B4(媒体类型无效)和内存不足问题,结合Win11媒体栈的特性,给出以下修复方案:
1. 限制预览分辨率,保持宽高比
直接使用MediaPlayerElement的实际尺寸可能生成过高分辨率的预览流,触发内存不足或格式不支持错误。建议限制最大预览分辨率(如1080P),并保持与合成内容一致的宽高比:
public void UpdateMediaElementSource() { // 限制预览最大分辨率为1080P const int MaxPreviewWidth = 1920; const int MaxPreviewHeight = 1080; int targetWidth = Math.Min((int)mediaPlayerElement.ActualWidth, MaxPreviewWidth); int targetHeight = Math.Min((int)mediaPlayerElement.ActualHeight, MaxPreviewHeight); // 匹配合成内容的宽高比,避免拉伸导致格式错误 if (composition.Clips.Any()) { var clip = composition.Clips[0]; double aspectRatio = (double)clip.NaturalSize.Width / clip.NaturalSize.Height; if ((double)targetWidth / targetHeight > aspectRatio) { targetWidth = (int)(targetHeight * aspectRatio); } else { targetHeight = (int)(targetWidth / aspectRatio); } } // 先释放旧资源再生成新流 mediaStreamSource?.Dispose(); mediaStreamSource = composition.GeneratePreviewMediaStreamSource(targetWidth, targetHeight); mediaPlayerElement.Source = MediaSource.CreateFromMediaStreamSource(mediaStreamSource); }
2. 严格管理MediaStreamSource资源
Win11对媒体资源的生命周期管理更严格,每次更新预览前必须释放旧的MediaStreamSource,避免内存泄漏:
private MediaStreamSource mediaStreamSource; public void UpdateMediaElementSource() { // 释放旧资源 if (mediaStreamSource != null) { mediaStreamSource.Dispose(); mediaStreamSource = null; } // 生成新预览流... }
3. 完善MediaFailed事件的错误捕获
当前空实现无法定位具体错误原因,建议添加详细日志和用户提示:
private async void MediaPlayer_MediaFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args) { string errorDetail = $"错误码: {args.ExtendedErrorCode:X}, 消息: {args.ErrorMessage}"; System.Diagnostics.Debug.WriteLine(errorDetail); // 主线程提示用户 await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { var dialog = new Windows.UI.Popups.MessageDialog(errorDetail, "预览失败"); await dialog.ShowAsync(); }); }
4. 预处理图片源
Win11对部分图片格式/高分辨率图片的兼容性与Win10存在差异:
- 确保所有图片为UWP支持的格式(JPG、PNG、BMP),避免使用WebP、RAW等小众格式
- 对超过4K分辨率的图片先进行压缩,再生成MediaClip
5. 延迟初始化预览
MediaPlayerElement未完全加载时设置源可能触发异常,可在控件Loaded事件后延迟初始化:
private async void MediaPlayerElement_Loaded(object sender, RoutedEventArgs e) { await Task.Delay(100); // 短延迟确保控件初始化完成 UpdateMediaElementSource(); }
内容的提问来源于stack exchange,提问作者Devanand kumar
相关产品推荐
相关产品推荐

