WPF用户界面上的VLC帧冻结

时间:2015-08-18 05:15:45

标签: c# wpf vlc

我有一个WPF用户界面,其中包含2个Vlc.DotNet元素以及一些经常更新的ImageDatagrid个。 这两个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();
    }));
}

0 个答案:

没有答案
相关问题