【问题标题】:Memory Leak on UWP MediaPlayer when looping循环时 UWP MediaPlayer 上的内存泄漏
【发布时间】: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 文件,没什么特别的。我们不会向集合添加引用或任何内容

标签: c# .net uwp media h.265


【解决方案1】:

如此处所述https://stackoverflow.com/a/54947557/1018232 这似乎是 Windows 10 中的一个错误。即使是内置的视频播放器“电影和电视”也有这个问题。似乎这只发生在 h.265 编解码器上。可能是解码器驱动程序错误或类似的东西。

【讨论】:

    【解决方案2】:

    WPF 中的不同媒体播放器元素的数量总是令人困惑。您正在使用MediaPlayerElement。它的文档明确提到它仍处于开放的 Beta 阶段:

    此控件目前作为 Windows 10 版本 1903 及更高版本的开发人员预览版提供。尽管我们鼓励您现在在自己的原型代码中试用此控件,但我们不建议您此时在生产代码中使用它。有关详细信息,请参阅 XAML Islands 功能路线图。如果您对此控件有反馈,请在 Microsoft.Toolkit.Win32 存储库中创建一个新问题,并将您的 cmets 留在那里。如果您希望私下提交反馈,可以将其发送至 XamlIslandsFeedback@microsoft.com。

    所以你完全有可能只是发现了一个错误。

    据我所知,在 MPE 之前播放 Media 的方法是 Storyboard 和 MediaPlayer/MediaElement 组合。据我所知,MediaPlayer 没有重复模式。所以event will have to do。具有更深入 WPF/UWP 知识的人将不得不告诉您,目前哪个是正确的。

    【讨论】:

    • 谢谢,我已尝试将 MediaPlayerElement 替换为 MediaElement (docs.microsoft.com/de-de/uwp/api/…)。该控件有一个名为IsLooping 的属性,但即使使用此控件,内存使用量也在不断上升。我猜它是编解码器或媒体框架本身的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    相关资源
    最近更新 更多