几分钟后循环 MediaElement 冻结或暂停一秒钟

Looping MediaElement freezes after some minutes or halts for a second

我有一个 .net framwork (4.7.2) wpf 应用程序,其中的视频(持续时间:10 到 50 秒)应该整天循环播放。

首先我实现了mirosoft建议的方式(使用故事板): How to: Repeat Media Playback (docs.microsoft.com)

<MediaElement Name="VideoMediaElement" Width="1920" Height="1080" Visibility="{Binding Path=IsVideoUriAvailable, Converter={StaticResource BooleanToVisibilityConverter}}">
    <MediaElement.Triggers>
        <EventTrigger RoutedEvent="MediaElement.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <MediaTimeline Source="{Binding Path=VideoUri, FallbackValue=null}" Storyboard.TargetName="VideoMediaElement"
                                       RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </MediaElement.Triggers>
</MediaElement>

但在我的测试中,我注意到视频会在 3 到 5 分钟后停止播放。
我找到了 this 篇文章,其中描述了同样的问题。
解决方案:使用第 3 方库或自己管理重复。

我想避免使用建议的库,因为它看起来不再维护了。所以我实施了(非常简单的)解决方案。

<MediaElement Name="VideoMediaElement"
              Width="1920" Height="1080" 
              Visibility="{Binding Path=IsVideoUriAvailable, Converter={StaticResource BooleanToVisibilityConverter}}"
              Source="{Binding Path=VideoUri, FallbackValue=null}"
              LoadedBehavior="Manual"
              Loaded="Video_OnLoaded"
              MediaEnded="Video_OnMediaEnded"/>
private void Video_OnLoaded(object sender, RoutedEventArgs e)
{
    VideoMediaElement.Play();
}

private void Video_OnMediaEnded(object sender, RoutedEventArgs e)
{
    VideoMediaElement.Position = TimeSpan.FromSeconds(0);
}

这个实现似乎更可靠,但我仍然有一个问题:当 OnMediaEnded 被触发时,视频停止了大约一秒钟。短暂的停顿之后,视频从头开始。

您对如何解决此短暂停止有任何建议吗?

private void Video_OnLoaded(object sender, RoutedEventArgs e)
{
    VideoMediaElement.Play();
}

private void Video_OnMediaEnded(object sender, RoutedEventArgs e)
{
    VideoMediaElement.Position = TimeSpan.FromSeconds(0);
    VideoMediaElement.Play();
}