尝试缓冲/预加载下一个视频时,WPF MediaElement短暂停顿

63lcw9qa  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(192)

我试图写一个程序,可以播放一系列的视频文件在一个平稳的方式,就好像它只是一个长视频。以前的问题,我发现网上建议预载/缓冲下一个视频,然后切换到只有当新的视频准备好了。我已经写了一个测试程序这样做。
当前播放器/下一个播放器与缓冲视频之间的切换工作正常,但当我分配新的MediaElement.Source /打开下一个文件时,播放中有短暂的口吃(只有几分之一秒,但非常明显)。
关于如何解决这个问题有什么想法吗?我需要用Task.Run()分离一个线程吗?(但我担心这会与UI线程产生所有权冲突...)。这只是MediaElement的性能限制吗?是否有变通方案/替代方案?例如,https://github.com/unosquare/ffmediaelement是否工作得更好?
真正疯狂的事情btw.是,我甚至试图打开2个不同的窗口,与第二个窗口在自己的线程,但第一个视频 * 仍然 * 口吃时,第二个窗口正在加载其文件。
谢谢!
我写了下面的简单测试程序。
窗口有3个叠加的MediaElements,Player 1/Player 2/Player 3。Player 1即使隐藏也始终在播放(我需要它是因为与当前问题无关的其他原因)。其中两个播放器始终隐藏(不透明度= 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);
        }
mftmpeh8

mftmpeh81#

这可能是因为您试图显示两个MediaElement在彼此的顶部。请尝试将可见性设置为可见性。折叠并设置为可见性。可见而不是不透明度。

相关问题