海康视频
默认都是最新的版本
为什么会出现两个.NET框架?.NET Framework 4.8是为UI准备,并且是通过PictureBox的方式使用。使用第二种方式可以全部改为.NET 7
软件包
提示
海康SDK
必须
集成到Winform:海康SDK提供的demo就是Winform
集成到WPF:也可以使用Winform的方式,但是不推荐,现在使用另外一种方式,需要使用FFMPEG,ReactiveUI可选,但是既然上了WPF,那么就装上它。
集成到Winform
海康本身提供了Winfrom的示例,注意的是将头文件
文件夹下的所有文件拷贝到项目目录下,记得项目和拷贝的文件分x86
和x64
集成到WPF
PictureBox方式
通过PictureBox就是用的传统Winform方式,但是毕竟WPF和Winform是两种不同的程序方式,需要适配下。
引用程序集
System.Windows.Forms
和WindowsFormsIntegration
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
Nuget包添加
Microsoft.Xaml.Behaviors.Wpf
添加行为命名空间
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
添加
PictureBox
控件<wfi:WindowsFormsHost> <wf:PictureBox x:Name="videoPictureBox"/> </wfi:WindowsFormsHost>
播放
这里使用Wpf中的
behaviors
,将PictureBox
控件本身当作参数传递即可。<Button Content="句柄预览"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <i:InvokeCommandAction Command="{Binding PlayCommand}" CommandParameter="{Binding ElementName=videoPictureBox}" /> </i:EventTrigger> </i:Interaction.Triggers> </Button>
Image方式
![WPF无句柄预览](https://nas.ilyl.life:8092/wpf/hk_p2.gif)
关键点
- FFMPEG
- 视频格式
FFMPEG很强大,但相关资料非常少。
从NuGet上下载FFmpeg.AutoGen
,如果能跑通提供的官方示例,问题已经解决了60%,在了解相关视频格式问题,已经完成了30%,剩下10%通过github和stackoverflow找相关问题或者案例。
使用WriteableBitmap作为Image的数据源
Views<Image RenderOptions.BitmapScalingMode="HighQuality" Source="{Binding VedioSource}" Stretch="Fill" UseLayoutRounding="True" />
ViewModelsprivate ImageSource _vedioSource = null; public ImageSource VedioSource { get { return _vedioSource; } set { _vedioSource = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(VedioSource))); } }
注意
WriteableBitmap需要在UI线程上声明
在写入WriteableBitmap时需要判断线程
使用海康回调模式,自己解码
通过FFmpeg提供的
sws_scale
进行转换
总结
如果只是单纯的展示,那么PictureBox是一种不错的方式。
更近一步的话,会发现两个常见小问题,更多问题见官方文档:
放大缩小窗体时,出现白色闪烁问题。
WPF句柄预览缩放问题 使用WPF控件无法放在PictureBox顶层。
WPF句柄预览叠加问题
为了解决这两个问题,使用Image方式是一种更好的方法。
但这里没有贴更多的代码及具体实现,但是过程及注意事项如上所示。
其一视频是个很深的学问;
其二代码由原来的几百行缩减到几十行,当然是托了FFMPEG
的福;
其三这里只是简单的预览视频,更多的操作及问题,后续遇见在写 😄
推荐一个WPF视频播放器示例