WPF MediaElement 在尝试缓冲/预加载下一个视频时出现短暂的卡顿

问题描述 投票:0回答:0

我正在尝试编写一个程序,可以流畅地播放一系列视频文件,就好像它只是一个长视频一样。我在网上找到的关于该主题的先前问题建议预加载/缓冲下一个视频,然后仅在新视频准备就绪后才切换。我已经编写了一个测试程序来做到这一点。

当前播放器/下一个播放器与缓冲视频之间的切换工作正常,但是当我分配新的 MediaElement.Source / 打开下一个文件时,播放中有一个短暂的卡顿(只有几分之一秒,但非常明显) .

关于如何解决这个问题的任何想法?我需要用 Task.Run() 拆分线程吗? (但恐怕会与 UI 线程产生所有权冲突......)。这只是 MediaElement 的性能限制吗?是否有解决方法/替代方案?例如,这 https://github.com/unosquare/ffmediaelement 会更好吗?

谢谢!

下面写了简单的测试程序

Window有3个叠加的MediaElements,Player1/Player2/Player3。 Player1 即使在隐藏时也总是在玩(出于与当前问题无关的其他原因,我需要它)。两个播放器始终处于隐藏状态(不透明度 = 0),我将下一个视频预加载到隐藏播放器中,而另一个播放器可见并正在播放。

如上所述,问题是当隐藏播放器加载下一个文件时,可见播放器中的播放会短暂卡顿。

MainWindow.xaml:

<Window x:Class="Test_App.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_App"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
        <Grid>
            <MediaElement x:Name="Player1" MediaOpened="P1MediaOpened" Stretch="UniformToFill" LoadedBehavior="Manual" UnloadedBehavior="Stop" />
            <MediaElement x:Name="Player2" Stretch="UniformToFill" LoadedBehavior="Manual" UnloadedBehavior="Stop" />
            <MediaElement x:Name="Player3" Stretch="UniformToFill" LoadedBehavior="Manual" UnloadedBehavior="Stop" />
        </Grid>
</Window>type here

cs文件:

namespace Test_App
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Player2.Opacity = 0.0;
            Player3.Opacity = 0.0;
            Player2.Volume = 0.0;
            Player3.Volume = 0.0;
            Player1.Source = new Uri("I:BaseVideo.mp4");
            Player1.Play();

            Loaded += LoadNextVideos;
        }

        private async void LoadNextVideos(object sender, RoutedEventArgs e)
        {
            Player2.Source = new Uri("002.mp4");
            await Task.Delay(3000);
            
            Player2.Play();
            Player2.Opacity = 1.0;
            Player1.Opacity = 0.0;
            await Task.Delay(2000);
            Player3.Source = new Uri("003.mp4");
            await Task.Delay(2000);
            Player3.Play();
            Player3.Opacity = 1.0;
            Player2.Opacity = 0.0;
            Player2.Pause();
            await Task.Delay(2000);
            Player2.Source = new Uri("004.mp4");
            await Task.Delay(2000);

            Player2.Play();
            Player2.Opacity = 1.0;
            Player3.Opacity = 0.0;
            Player3.Pause();
            await Task.Delay(2000);
            Player3.Source = new Uri("005.mp4");
            await Task.Delay(2000);
            Player3.Play();
            Player3.Opacity = 1.0;
            Player2.Opacity = 0.0;
            Player2.Pause();
            await Task.Delay(2000);
            Player2.Source = new Uri("006.mp4");
            await Task.Delay(2000);
        }
c# wpf mediaelement
© www.soinside.com 2019 - 2024. All rights reserved.