wpf 更改无 Flink 的MediaElement源

6rqinv9w  于 2023-05-08  发布在  Flink
关注(0)|答案(2)|浏览(196)

我有一个简单的视频播放器,它使用WPF MediaElement播放一系列视频。视频一起形成围绕静止图像移动的一个连续的膜。在每个视频结束时,移动冻结在当前播放视频的最后一帧上。当我按下一个按钮时,下一个视频播放,这继续围绕静止图像的移动。这是一个应用程序,我要用它来给予演讲。实际上,我已经得到了一系列视频,其中每个视频的最后一帧与下一个视频的第一帧相同。
我正在使用WPF MediaElement,并在用户单击鼠标时更改Source属性。
我遇到的问题是,当我更改Source属性时,在加载下一个视频时,MediaElement变为透明。这意味着视频之间存在 Flink 。有没有办法防止这种 Flink ?我还可以使用哪些其他策略?
下面是一些代码:

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

        this.x_MediaElement.MouseLeftButtonDown += x_MediaElement_MouseLeftButtonDown;
        this.MouseLeftButtonDown += MainWindow_MouseLeftButtonDown;

        this.WindowStyle = WindowStyle.None;
        this.WindowState = WindowState.Maximized;
    }

    void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MoveNext();   
    }

    private void MoveNext()
    {
        _sourceIndex++;
        if (_sourceIndex >= _sources.Length)
            _sourceIndex = 0;

        Debug.WriteLine(string.Format("Playing {0}", _sources[_sourceIndex]));

        this.x_MediaElement.Source = new Uri(_sources[_sourceIndex]);
        this.x_MediaElement.Play();

    }

    private int _sourceIndex = -1;

    private string[] _sources = new string[] {
        //SOURCE GO HERE
    };

    void x_MediaElement_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MoveNext();
        e.Handled = true;
    }
}
fgw7neuy

fgw7neuy1#

我跟你说实话MediaElement的bug多得你用手指都数不过来。从那开始,mediaElement在播放20个视频后爆炸(没有更多的MediaEnded事件,它将崩溃或类似的事情)。当然还有表演。它不与垂直同步同步。因此,视频实际上可能看起来滞后。
我建议你看看DirectShow技术(本质上WPF是基于什么,但你可以切换渲染器,这将避免滞后)。考虑到你不会开发任何专业的应用程序,我想MediaElement会很好。
然而,MediaElement是最简单的选择,如果它适合您,那么就继续使用它。至于你的问题,我认为有几个可能的解决方案:

  • 有两个MediaElement并在它们之间切换。如果一个视频结束,则在另一个MediaElement中启动另一个vid,只要在第二个mediaElement上播放第一帧,则隐藏第一个mediaElement,反之亦然。您可以轮询位置,也可以轮询MediaStarted事件。这样, Flink 几乎不可能被注意到。
  • 如果你想流畅的视频播放没有任何 Flink 在所有,有GMFPlay。你可以去看看。虽然它不是MediaElement。但它可以同时播放视频,没有任何 Flink 。
  • 截取最后一帧的截图(你可以用WPF截取截图),并在MediaElement秘密加载时将其显示为Image。
nhaq1z21

nhaq1z212#

here所建议的,最好使用MediaPlayerElement而不是MediaElement

相关问题