C# 实现视频预览功能
最近新同事在项目中遇到一个难题,如何实现本地视频的预览功能?
我首先想到的是利用Emgu CV 来实现此功能。
C/C++中用的是Open CV ,为了使其可以用在.net环境。对Open CV 函数进行了封装,且网上对于Emgu CV的资料比较少。为此也专门在此跟大家交流。
电脑:win10系统,
Emgu CV版本: 3.1.0.1,
开发环境:VS 2019,
一、安装Emgu CV
1、打开NuGet包管理器-浏览-搜索:emgu CV
找到3.1.0.1版本进去安装
安装成功后,回到项目里查看引用项是否包含引用了这些
完了以后可以引用命名空间进行使用了,并添加相应的控件。窗体设计如下
1、textbox 用于显示、记录视频文件的绝对路径。
2、button 用于openfiledialog进行打开选择文件。
3、4、numericUpDown 用于用户进行参数设置。
5、imagebox 是安装emgu CV后带的控件,其主要是显示视频的控件,其原理通俗理解为:视频是由无数张图片,按照一定序列、给其一定的间隔时间(也就是帧速率)去播放图片,就形成了我们所看到的的视频。所以imagebox其实是继承picturebox并增加一些功能进行封装的控件。所以picturebox其实也是可以用来显示视频。如果工具栏中没用出现emgu CV的控件
窗体设置好后就可以进行码了。
其中最重要的的一点就是
///打开视频文件
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();//实例化选择文件窗口
openFile.Filter = "视频文件|*.mp4*|所有文件|*.*";//筛选文件
if (openFile.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFile.FileName;//选择的视频
capture = new Capture(textBox1.Text);//打开视频
framecount = (int)(capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount));//获取视频总帧数
capture.ImageGrabbed += Capture_ImageGrabbed;
capture.Start();//开始播放
frameindex = 0;//清零
toindex = 0;//清零
}
}
源代码:c#视频预览-Demo