Цикл MediaElement зависает через несколько минут или останавливается на секунду - PullRequest
1 голос
/ 14 октября 2019

У меня есть приложение .net framwork (4.7.2) wpf, в котором видео (длительность: от 10 до 50 секунд) должно быть зациклено весь день.

Сначала я реализовал предложенный способот mirosoft (с использованием раскадровки): Как выполнить повторное воспроизведение мультимедиа (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 минут.
Я нашел эту статью, в которой описана та же проблема.
Решение: Использование сторонней библиотеки или управление повторением самостоятельно.

Я хочу избежатьиспользуя предложенную библиотеку, потому что похоже, что она больше не поддерживается. Итак, я реализовал (очень простое) решение.

<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,После этой короткой остановки видео начинается с самого начала.

У вас есть предложения, как исправить эту короткую остановку?

1 Ответ

1 голос
/ 15 октября 2019
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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...