我有一个WPF用户界面,其中包含2个Vlc.DotNet元素以及一些经常更新的Image
和Datagrid
个。
这两个VLC元素中的每一个都从文件或IP-Camera播放流
UI上的其他元素,在每分钟都经常更新,而不是常规操作。这些更新的说明来自程序中的另一个Thread
,并使用Invoke
更新用户界面。
问题是VLC播放器元素,随机帧冻结 有关可能原因的任何想法?
其他信息:我使用的是VLC 2.2.0 x86和VS2013。
修改:添加一些代码:
WPF代码:
<Grid Name="_cameraBox" FlowDirection="LeftToRight" Visibility="Collapsed" >
<vlc:VlcControl x:Name="myVlcControl1" />
<Grid>
<Grid.Background>
<VisualBrush Stretch="Fill">
<VisualBrush.Visual>
<Border BorderBrush="Black" BorderThickness="12" CornerRadius="10">
<Viewbox>
<Image Source="{Binding ElementName=myVlcControl1, Path=VideoSource}" />
</Viewbox>
</Border>
</VisualBrush.Visual>
</VisualBrush>
</Grid.Background>
<Image Source="/Resources/Images/Logo.png" Stretch="Uniform" Margin="10"/>
</Grid>
</Grid>
C#代码:
private void LoadTheStream(int streamNumber, string streamAddress)
{
Dispatcher.Invoke(new Action(() =>
{
if(InitialPrameters.UsingViedo)
{
streamAddress = "file:///" + streamAddress;
}
var vlc = (Vlc.DotNet.Wpf.VlcControl) this.FindName("myVlcControl" + streamNumber.ToString());
vlc.Stop();
vlc.Media = new LocationMedia(streamAddress);
vlc.Play();
}));
}
和更新UI代码的事件:
private void UpdateImageOnUI(object sender, EventArgs e)
{
var args = e as UIUpdateEventArgs;
ShowTheFrame(args.StreamNumber, args.SnapShot, args.FrameCrop);
}
private void ShowDetectedFrame(int streamNumber, Bitmap snapShot, Bitmap frameCrop)
{
Dispatcher.Invoke(new Action(() =>
{
var snapShotCtrl = (System.Windows.Controls.Image) FindName("_snapShot" + streamNumber.ToString());
var frameCropCtrl = (System.Windows.Controls.Image) FindName("_frameCrop" + streamNumber.ToString());
var snapShotImage = GeneralFunctions.ConvertToBitmapImageFromBitmap(snapShot);
var frameCropImage = GeneralFunctions.ConvertToBitmapImageFromBitmap(frameCrop);
snapShotCtrl.Source = snapShotImage;
frameCropCtrl.Source = frameCropImage;
snapShotImage.Freeze();
frameCropImage.Freeze();
}));
}