前言

本文主要讲述,在WPF中,借助Vlc.DotNet调用VLC类库,实现视频播功能,下面我们先来做开发前的准备工作。

准备工作

首先,我们创建一个项目WpfVLC,然后,进入Neget搜索Vlc.DotNet,得到如下界面:

我们选择Vlc.DotNet.Wpf,点击安装(这里我已经安装了,所以图中显示为卸载)。

然后,我们去VLC官网,下载VLC播放器。

VLC官网:http://www.videolan.org/

因为我的电脑是64位的,所以我下载64位的VLC版本,如下图:

下载完成后,正常安装即可,下载的文件截图如下:

安装完成后,我们找到安装的具体位置并打开,如下图:

在文件夹内我们找到文件libvlc.dll,libvlccore.dll和文件夹plugins,然后将他们复制出来。

现在我们回到我们刚刚创建的项目WpfVLC,进入文件目录,打开debug文件夹,然后我们在其目录下创建一个文件夹libvlc,如下:

然后,在在liblic下建立一个文件夹win-x64,如下:

再然后,我们将刚刚复制的vlc的三个文件,放到这个文件夹下,如下:

到此,我们的准备工作就完成了,现在开始编码。

使用Vlc.DotNet播放视频

现在,我们进入项目的代码开发。

首先我们将项目设置为64位项目,因为我们使用的VLC是64的。

然后,我们打开MainWindow页面。

在页面命名空间引入的地方加入Vlc.DotNet的命名空间。

xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"

接着,我们在页面布局中加入VlcControl控件和打开文件、播放、停止的按钮,如下:

<DockPanel DockPanel.Dock="Bottom">
<StackPanel Height="50" DockPanel.Dock="Bottom" Orientation="Horizontal">
<Button Name="btnOpen" Content="打开文件" Click="open_Click" Width="80"></Button>
<Button Name="btnPause" Content="暂停" Click="pause_Click" Width="50"></Button>
<Button Name="btnStop" Content="停止" Click="stop_Click" Width="50"></Button>
</StackPanel>
</DockPanel>
<vlc:VlcControl x:Name="VlcControl" />

然后,我们编写xaml.cs文件的代码,如下:

public partial class MainWindow : Window
{
private string filePath;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var currentAssembly = Assembly.GetEntryAssembly();
var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;
var libDirectory = new DirectoryInfo(System.IO.Path.Combine(currentDirectory, "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));
this.VlcControl.SourceProvider.CreatePlayer(libDirectory);
}
private void open_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = false;
ofd.Title = "请选择视频文件";
var result = ofd.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
filePath = ofd.FileName;
try
{
btnPause.Content = "暂停";
this.VlcControl.SourceProvider.MediaPlayer.Play(new Uri(filePath));
}
catch (Exception ex)
{ }
}
}
public void pause_Click(object sender, RoutedEventArgs e)
{
if (btnPause.Content.ToString() == "播放")
{
btnPause.Content = "暂停";
this.VlcControl.SourceProvider.MediaPlayer.Play();
}
else
{
btnPause.Content = "播放";
this.VlcControl.SourceProvider.MediaPlayer.Pause();
}
}
private void stop_Click(object sender, RoutedEventArgs e)
{
new Task(() =>
{
this.VlcControl.SourceProvider.MediaPlayer.Stop();//这里要开线程处理,不然会阻塞播放 }).Start();
}
}

这样,我们就完成了最基本的视频播放、暂停、停止的功能。

可以看到,播放、暂停、停止的代码非常简单,就是调用控件的play,pause,stop函数即可。

因为VLC非常优秀,可以支持多种格式的文件播放,所以我们写的这个播放器也就可以打开任意类型的视频文件。

播放界面如下:

现在,加入Slider控制播放进度和音量。

Slider样式,参考如下文章:

WPF依赖属性的正确学习方法

WPF滑块控件(Slider)的自定义样式

VlcControl控制播放进度的方法很简单,如下:

 private void Slider1_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
var position = (float)(slider1.Value / slider1.Maximum);
if (position == 1)
{
position = 0.99f;
}
this.VlcControl.SourceProvider.MediaPlayer.Position = position;//Position为百分比,要小于1,等于1会停止
}

控制播放声音的方法如下:

private void Slider2_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
//Audio.Volume:音量的百分比,值在0—200之间
this.VlcControl.SourceProvider.MediaPlayer.Audio.Volume = (int)slider2.Value;
}

这样我们的播放器就开发完成了。

最终界面如下:

播放其他视频源

播放RTSP

通过上面的代码编写,我们了解到了,在C#里使用VLC播放视频的代码非常简单,只要在Play函数中写入地址即可。

那么播放RTSP自然是同理,只要在Play中写入RTSP的地址即可,如下:

 this.VlcControl.SourceProvider.MediaPlayer.Play(new Uri(rtsp://192.168.1.111));

播放摄像头

播放摄像头在这里也很简单,只是Play的入参稍微要注意一下即可,如下:

string mrl = @"dshow://  ";
string optVideo = @":dshow-vdev=摄像头设备名";
//string optAudio = @":dshow-adev=音频设备名";
string size = ":dshow-size=800";
this.VlcControl.SourceProvider.MediaPlayer.Play(mrl, optVideo, size);

----------------------------------------------------------------------------------------------------

到此C#开发可播放摄像头及任意格式视频的播放器完成了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/WpfVLC

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!
本文已独家授权给脚本之家(ID:jb51net)公众号发布!

https://www.cnblogs.com/kiba/p/11303137.html

C#开发可播放摄像头及任意格式视频的播放器的更多相关文章

  1. 基于VLC库C#开发可播放摄像头及任意格式视频的播放器

    前言 本文主要讲述,在WPF中,借助Vlc.DotNet调用VLC类库,实现视频播功能,下面我们先来做开发前的准备工作. 准备工作 首先,我们创建一个项目WpfVLC,然后,进入Neget搜索Vlc. ...

  2. Android 音视频开发(一):PCM 格式音频的播放与采集

    什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...

  3. 任意格式视频转MP4格式

    下载ffmpeg解压,提取ffmpeg.exe 在mmfpeg.exe目录下新建批处理,内容如下 @echo off title 正在转换,mp4转换完成自动关闭 ffmpeg -i %1 -y -q ...

  4. C#使用EmguCV实现视频读取和播放,及多个视频一起播放的问题

    大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1)第一种方法,使用委托: private delega ...

  5. Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用(转)

    原文地址:http://blog.csdn.net/yanzi1225627/article/details/8605061# 很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预览 ...

  6. H5 多个视频 循环播放效果

    跟轮播效果差不多 页面HTML结构 <video id="myvideo" width="100%" height="auto" co ...

  7. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...

  8. Unity3D中以任意格式获取时间(C# .net也可用)

    最近楼主在开发中遇到了一个小问题 需要保存截图,同时把时间作为截图的名字存储 时间的保存格式为 2016-12-08 13:15:00 保存截图的流程就不说了,这篇博客只说一下以任意的格式保存时间. ...

  9. opencv实例三:播放AVI格式视频

    一.不带滚动条的视频读取播放. 1.原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的视频流进行处理了. 2.代码如下: /************* ...

随机推荐

  1. HTML5新增的表单验证功能

    一.HTML5表单的特点: HTML5 表单增加了许多内置的控件和控件属性 XHTML 中需要放在 form 之中的诸如 input/button/select/textarea 等标签元素,在 HT ...

  2. RABC权限控制(二级菜单实现)

    目前大部分系统由于用户体验,基本上菜单不会做的很深,以二级菜单为例,做了一个简单的权限控制实现,可精确到按钮级别(基于django),下面具体看看实现 1.表结构的设计 无论开发什么都需要先梳理清楚需 ...

  3. java请求转发,响应重定向的区别

    请求转发:request.getRequestDispatcher().forward(); 例:request.getRequestDispatcher("/index.jsp" ...

  4. Codeforces 730B:Minimum and Maximum(交互式问题)

    http://codeforces.com/problemset/problem/730/B 题意:一个交互式问题,给出一个n代表有n个数字,你可以问下标为x和y的数的大小,会给出"> ...

  5. django基础知识之csrf:

    csrf 全称Cross Site Request Forgery,跨站请求伪造 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完 ...

  6. c++ 求int数组的长度

    c++ 求int数组的长度 网上有一些方法是 sizeof(arr) / sizeof(arr[0]); 这种方法放在函数中,是不对的 我自己的方法是 #include <bits/stdc++ ...

  7. ZigBee按键中断

    何为按键中断? 在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候: 突然有自身函数或外部的影响,而使程序执行到别的任务再回来. 举个栗子: 当你在做饭的时候,电 ...

  8. webpack4基础入门操作(一)

    基于webpack4实践:开始:打开控制面板,制定到创建Webpack的文件夹. 并创建初始配置文件package.json 输入命令:npm init -y,在文件夹中出现一个package.jso ...

  9. kuangbin专题专题四 Heavy Transportation POJ - 1797

    题目链接:https://vjudge.net/problem/POJ-1797 思路:请参考我列出的另一个题目,和这个题目要求的值相反,另一个清楚后,这个写的解释就明白了. 另一个类似题目的博客:h ...

  10. Java操作文件

    import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attrib ...