使用 Vlc.DotNet 在 C# (WPF) 项目中集成 VLC 播放器
Integrate VLC player in C# (WPF) project using Vlc.DotNet
我想在我的项目中集成一个 VLC 播放器来显示摄像机流。为此,我尝试在我的 WPF 项目中使用 Vlc.DotNet(2.1.126 版本)。
我的测试是在下面的 XAML 文件中完成的(我在 XAML/WPF 有点初学者):
<UserControl x:Class="TVSCS_View.VideoDisplay.VideoPlayerControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:TVSCS_View.VideoDisplay"
xmlns:wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300"
x:Name="controlVideoDisplay"
DataContext="{Binding ElementName=controlVideoDisplay}">
<Border BorderBrush="Black"
BorderThickness="1">
<Grid x:Name="videoDisplayLayoutRoot"
Margin="5,5,5,5">
<Image Source="{Binding ElementName=myVlcControl}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
<ctrl:VideoCommandsControl x:Name="videoPlayerControl"
VerticalAlignment="Bottom"
Height="25"
Width="175"
Visibility="Visible"
Margin="10,0,10,20" />
<ctrl:VideoTimeLineControl x:Name="timeLineControl"
VerticalAlignment="Bottom"
Margin="0,0,0,0"/>
</Grid>
</Border>
</UserControl>
关联的 .cs 文件是:
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Vlc.DotNet.Wpf;
namespace TVSCS_View.VideoDisplay
{
/// <summary>
/// Logique d'interaction pour VideoPlayerControl.xaml
/// </summary>
public partial class VideoPlayerControl : UserControl
{
public VlcControl myVlcControl;
public VideoPlayerControl()
{
InitializeComponent();
MediaPlayer media = new MediaPlayer();
myVlcControl = new VlcControl();
var currentAssembly = Assembly.GetEntryAssembly();
var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;
if (Environment.Is64BitOperatingSystem)
{
myVlcControl.MediaPlayer.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(currentDirectory, @"C:\Users\t0115019\Documents\Visual Studio 2015\Projects\tvscs_display\packages\VLC\"));
}
myVlcControl.MediaPlayer.EndInit();
myVlcControl.MediaPlayer.Play(new Uri("C:/Users/Documents/WP_20160908_11_16_53_Pro.mp4"));
}
}
}
目前,当我执行应用程序时,我有一个异常 "FillNotFOundException" 链接到 "myVlcControl.MediaPlayer.EndInit()" 行。
如果我删除此行,UserControl 中将不会显示任何内容。
备注:
我尝试使用以下方法集成 VlcControl:
<UserControl x:Class="TVSCS_View.VideoDisplay.VideoPlayerControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:TVSCS_View.VideoDisplay"
xmlns:wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300"
x:Name="controlVideoDisplay"
DataContext="{Binding ElementName=controlVideoDisplay}">
<Border BorderBrush="Black"
BorderThickness="1">
<Grid x:Name="videoDisplayLayoutRoot"
Margin="5,5,5,5">
<wpf:VlcControl x:Name="myVlcControl" />
</Grid>
</Border>
</UserControl>
但在这种情况下,我收到以下消息:
无法将类型 "VlcControl" 的值添加到类型 'UIElementCollection'.
的集合或字典中
你有办法解决我的小问题吗?
谢谢
WPF 版本的 VlcControl
只是一个 WindowsFormsHost
控件托管 Windows Forms 版本的 VlcControl
。根据错误消息("VlcControl" 类型的值无法添加到 'UIElementCollection' 类型的集合或字典中),您只是缺少对WindowsFormsIntegration
程序集,其中定义了 WindowsFormsHost
(可以在参考管理器中的 Assemblies → Framework 下找到)。
这是一个 WPF window 托管 VLC 播放器的完整示例。您需要安装 Vlc.DotNet.Wpf NuGet package(及其依赖项)并引用 WindowsFormsIntegration
程序集。
MainWindow.xaml
<Window x:Class="HelloVlc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf">
<vlc:VlcControl x:Name="vlcPlayer" />
</Window>
MainWindow.xaml.cs
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
vlcPlayer.MediaPlayer.VlcLibDirectory =
//replace this path with an appropriate one
new DirectoryInfo(@"c:\Program Files (x86)\VideoLAN\VLC\");
vlcPlayer.MediaPlayer.EndInit();
vlcPlayer.MediaPlayer.Play(new Uri("http://download.blender.org/peach/" +
"bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));
}
}
我想在我的项目中集成一个 VLC 播放器来显示摄像机流。为此,我尝试在我的 WPF 项目中使用 Vlc.DotNet(2.1.126 版本)。
我的测试是在下面的 XAML 文件中完成的(我在 XAML/WPF 有点初学者):
<UserControl x:Class="TVSCS_View.VideoDisplay.VideoPlayerControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:TVSCS_View.VideoDisplay"
xmlns:wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300"
x:Name="controlVideoDisplay"
DataContext="{Binding ElementName=controlVideoDisplay}">
<Border BorderBrush="Black"
BorderThickness="1">
<Grid x:Name="videoDisplayLayoutRoot"
Margin="5,5,5,5">
<Image Source="{Binding ElementName=myVlcControl}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
<ctrl:VideoCommandsControl x:Name="videoPlayerControl"
VerticalAlignment="Bottom"
Height="25"
Width="175"
Visibility="Visible"
Margin="10,0,10,20" />
<ctrl:VideoTimeLineControl x:Name="timeLineControl"
VerticalAlignment="Bottom"
Margin="0,0,0,0"/>
</Grid>
</Border>
</UserControl>
关联的 .cs 文件是:
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Vlc.DotNet.Wpf;
namespace TVSCS_View.VideoDisplay
{
/// <summary>
/// Logique d'interaction pour VideoPlayerControl.xaml
/// </summary>
public partial class VideoPlayerControl : UserControl
{
public VlcControl myVlcControl;
public VideoPlayerControl()
{
InitializeComponent();
MediaPlayer media = new MediaPlayer();
myVlcControl = new VlcControl();
var currentAssembly = Assembly.GetEntryAssembly();
var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;
if (Environment.Is64BitOperatingSystem)
{
myVlcControl.MediaPlayer.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(currentDirectory, @"C:\Users\t0115019\Documents\Visual Studio 2015\Projects\tvscs_display\packages\VLC\"));
}
myVlcControl.MediaPlayer.EndInit();
myVlcControl.MediaPlayer.Play(new Uri("C:/Users/Documents/WP_20160908_11_16_53_Pro.mp4"));
}
}
}
目前,当我执行应用程序时,我有一个异常 "FillNotFOundException" 链接到 "myVlcControl.MediaPlayer.EndInit()" 行。 如果我删除此行,UserControl 中将不会显示任何内容。
备注: 我尝试使用以下方法集成 VlcControl:
<UserControl x:Class="TVSCS_View.VideoDisplay.VideoPlayerControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:TVSCS_View.VideoDisplay"
xmlns:wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300"
x:Name="controlVideoDisplay"
DataContext="{Binding ElementName=controlVideoDisplay}">
<Border BorderBrush="Black"
BorderThickness="1">
<Grid x:Name="videoDisplayLayoutRoot"
Margin="5,5,5,5">
<wpf:VlcControl x:Name="myVlcControl" />
</Grid>
</Border>
</UserControl>
但在这种情况下,我收到以下消息: 无法将类型 "VlcControl" 的值添加到类型 'UIElementCollection'.
的集合或字典中你有办法解决我的小问题吗? 谢谢
WPF 版本的 VlcControl
只是一个 WindowsFormsHost
控件托管 Windows Forms 版本的 VlcControl
。根据错误消息("VlcControl" 类型的值无法添加到 'UIElementCollection' 类型的集合或字典中),您只是缺少对WindowsFormsIntegration
程序集,其中定义了 WindowsFormsHost
(可以在参考管理器中的 Assemblies → Framework 下找到)。
这是一个 WPF window 托管 VLC 播放器的完整示例。您需要安装 Vlc.DotNet.Wpf NuGet package(及其依赖项)并引用 WindowsFormsIntegration
程序集。
MainWindow.xaml
<Window x:Class="HelloVlc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf">
<vlc:VlcControl x:Name="vlcPlayer" />
</Window>
MainWindow.xaml.cs
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
vlcPlayer.MediaPlayer.VlcLibDirectory =
//replace this path with an appropriate one
new DirectoryInfo(@"c:\Program Files (x86)\VideoLAN\VLC\");
vlcPlayer.MediaPlayer.EndInit();
vlcPlayer.MediaPlayer.Play(new Uri("http://download.blender.org/peach/" +
"bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));
}
}