【发布时间】:2019-12-03 00:37:12
【问题描述】:
我们目前正在使用 MediaPlayerElement 在 UWP 应用中作为背景播放 4K h.265 视频。我们已经使用IsLoopingEnabled = true 将 MediaPlayer 设置为无限循环。问题是,每次视频循环时内存使用量都会增加。如果我们禁用循环,则不会发生内存泄漏。我们尝试通过在视频结束时将位置重置为零来手动循环视频,但它仍然会泄漏内存。我们还尝试调用 System.GC.collect() 但这也没有任何作用。
这是 UWP 错误还是我们遗漏了什么?
编辑:
这是我们正在使用的代码:
MainPage.xaml
<Page
x:Class="MyProject.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:MyApp.Controls"
xmlns:xaml="using:Microsoft.Graphics.Canvas.UI.Xaml"
mc:Ignorable="d"
Background="Black" Loaded="MainPage_OnLoaded" Unloaded="MainPage_OnUnloaded">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{StaticResource AppBrushNewBlue1}">
<MediaPlayerElement Name="bgMovie" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AreTransportControlsEnabled="False" ></MediaPlayerElement>
<Canvas Name="mainCanvas" ManipulationMode="None" Background="Transparent">
</Canvas>
</Grid>
MainPage.xaml.cs
private MediaSource ms;
private async void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
ms = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/bg_animation_V2.mp4"));
bgMovie.Source = ms;
bgMovie.MediaPlayer.IsLoopingEnabled = true;
bgMovie.MediaPlayer.Play();
[...]
}
我们不再对 MediaSource 或 mediaPlayer 本身做任何事情。当我们禁用IsLoopingEnabled 时,不会再发生内存泄漏。
【问题讨论】:
-
请向我们展示加载/分配视频到媒体播放器和手动循环的实际代码。特别是视频源是什么?您是否将对该视频的引用添加到任何收藏夹中?
-
如果 GC.Collect() 什么都不做,你要么有未清理的未管理资源,要么是引用内存泄漏,要么是真正的内存泄漏。但是前两个确实是几个订单更有可能x。
-
我添加了一些我们正在使用的代码。视频源是 h.265 mp4 文件,没什么特别的。我们不会向集合添加引用或任何内容