我正在尝试编写一个程序,可以流畅地播放一系列视频文件,就好像它只是一个长视频一样。我在网上找到的关于该主题的先前问题建议预加载/缓冲下一个视频,然后仅在新视频准备就绪后才切换。我已经编写了一个测试程序来做到这一点。
当前播放器/下一个播放器与缓冲视频之间的切换工作正常,但是当我分配新的 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);
}