在Wpf 下,使用 VlcControl 控件,可以实现很多强大的播放功能和解码功能。但是在使用过程中发现当视频播放时,会有预加载时间,导致出现闪黑屏的情况。如下面gif所展示。
这种情况其实是VlcControl视频控件在预加载视频,从而导致得切换产生“闪黑”的现象,通过查阅,发现目前网络上大部分得解决方法都是采用双控件切换的方法解决。即,定义两个控件,每次使用另一个进行预加载。之后切换控件解决。
在实际项目中,采用如上方法会出现一下问题:1.控件占用资源大,当长时间运行得时候,多次加载资源如果不正确释放会产生内存泄漏。2.控件多次实例化会有一定概率奔溃。所以综合考虑放弃。最后自己琢磨出一套解决方案,首先我们要解决的仅仅是”闪黑“问题,所以在视频播放开始隐藏该视屏控件。那么就会看到背景图,所以我们让背景图变成视频结束得最后一帧。然后影藏控件,最后等待加载完成,将视频切换到最开始得界面。最后显示控件,就可以完美解决,下面上一些代码片段供大家参考。
在视屏播放的时候隐藏控件并设置背景,注意 vlcControl.SourceProvider.VideoSource中存放的是视频当前的图像,是引用类型,所以一定要Clone()。
ImageSource img = vlcControl.SourceProvider.VideoSource.Clone();
ImageBrush ib = new ImageBrush();
ib.ImageSource = img;
this.Background = ib;
vlcControl.Visibility = Visibility.Hidden;
当设置完背景再进行预加载,通过vlcControl.SourceProvider.MediaPlayer.Position = 0.01f;将视频切换到第一帧并显示播放。
vlcControl.SourceProvider.MediaPlayer.Play(new Uri(videoUrl), options);
Task ta = new Task(() =>
{
Thread.Sleep(1500);
vlcControl.Dispatcher.Invoke(new Action(() =>
{
vlcControl.SourceProvider.MediaPlayer.Position = 0.01f;
vlcControl.Visibility = Visibility.Visible;
}));
});
ta.Start();
以上就是本人在解决”闪黑“问题的方法和心得,欢迎大家一起交流,或者有更好的建议。文章为本人原创,如需转载请注明出处。