c# 视频播放之Vlc.DotNet.Forms

先说下优缺点

优点:与电脑无关,能播放主流编码格式视频。

缺点:只能播放本地视频,网络视频播放不了。

下面是具体操作和代码

1. 安装Vlc.DotNet.Forms 和 VideoLAN.LibVLC.Windows

Vlc.DotNet.Forms 是播放库,VideoLAN.LibVLC.Windows用于播放显示

2. 界面布局

用到 vlcControl: 视频播放组件 ;滑块 TrackBar :自定义控件,用于显示视频播放进度和音量;button:视频播放和快进

我播放是网上的视频, 所以调用线程先将视频下载到本地,下载完成后在播放。

lTrackBar_vedio 和 lTrackBar_voice 是我自定义的滑块,可以直接用系统默认的滑块控件。

 public partial class Form1 : Form{private string url = @"http://www.xxxxx.com/video/20240111155329.mp4";private string vedioPath = AppDomain.CurrentDomain.BaseDirectory + @"Vedio\123.mp4";private long vedioLength = 0;private string vedioTime;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Vedio"))Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Vedio");if (!File.Exists(vedioPath)){VedioDownloader urlDownloader = new VedioDownloader(vedioPath, url);new Thread(new ThreadStart(urlDownloader.DownloadFileAsync)).Start(); ;}else{InitVedio();  }}private void InitVedio(){vlcControl1.Play(new FileInfo(vedioPath));button_play.BackgroundImage = Properties.Resources.audioPlay;vlcControl1.Audio.Volume = this.lTrackBar_voice.L_Value;lTrackBar_vedio.L_Maximum = this.lTrackBar_vedio.Width;lTrackBar_vedio.L_Minimum = 0;}//加载播放需要的库private void vlcControl1_VlcLibDirectoryNeeded(object sender, Vlc.DotNet.Forms.VlcLibDirectoryNeededEventArgs e){var currentAssembly = Assembly.GetEntryAssembly();var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;if (currentDirectory != null){if (IntPtr.Size == 4){e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc\win-x86"));}else{e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc\win-x64"));}}if (!e.VlcLibDirectory.Exists){var folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();folderBrowserDialog.Description = "Select Vlc libraries folder.";folderBrowserDialog.RootFolder = Environment.SpecialFolder.Desktop;folderBrowserDialog.ShowNewFolderButton = true;if (folderBrowserDialog.ShowDialog() == DialogResult.OK){e.VlcLibDirectory = new DirectoryInfo(folderBrowserDialog.SelectedPath);}}}private void vlcControl1_TimeChanged(object sender, Vlc.DotNet.Core.VlcMediaPlayerTimeChangedEventArgs e){vedioLength = vlcControl1.VlcMediaPlayer.Length;string allTime = ConvertTimeStampToDateTime(vedioLength);string current = ConvertTimeStampToDateTime(vlcControl1.VlcMediaPlayer.Time);this.lTrackBar_vedio.L_Value = Convert.ToInt32(1.0f * (lTrackBar_vedio.L_Maximum - lTrackBar_vedio.L_Minimum) * vlcControl1.VlcMediaPlayer.Time / vedioLength);vedioTime = current + " / " + allTime;SetVedioTime(vedioTime);}/// <summary>/// 使用委托显示视频时间/// </summary>/// <param name="text"></param>delegate void SetTextCallBack(string text);private void SetVedioTime(string vedioTime){if (this.label_vedioTime.InvokeRequired){SetTextCallBack stcb = new SetTextCallBack(SetVedioTime);this.BeginInvoke(stcb, new object[] { vedioTime });}else{this.label_vedioTime.Text = vedioTime;}}private string ConvertTimeStampToDateTime(long vedioLength){DateTime dt = new DateTime(vedioLength * 10000);return dt.Hour.ToString().PadLeft(2, '0') + ":" + dt.Minute.ToString().PadLeft(2, '0') + ":" + dt.Second.ToString().PadLeft(2, '0');}private void button_play_Click(object sender, EventArgs e){if (vlcControl1.State == Vlc.DotNet.Core.Interops.Signatures.MediaStates.Playing){vlcControl1.Pause();button_play.BackgroundImage = Properties.Resources.audioPause2;}else{if (vlcControl1.State == Vlc.DotNet.Core.Interops.Signatures.MediaStates.Ended){InitVedio();}else{button_play.BackgroundImage = Properties.Resources.audioPlay;vlcControl1.Play();}}}private void button_voice_Click(object sender, EventArgs e){if (lTrackBar_voice.L_Value != 0){lTrackBar_voice.L_Value = 0;button_voice.BackgroundImage = Properties.Resources.voice_close;}else{lTrackBar_voice.L_Value = 80;button_voice.BackgroundImage = Properties.Resources.voice_open;}}private void lTrackBar_voice_LValueChanged(object sender, LEventArgs e){vlcControl1.Audio.Volume = lTrackBar_voice.L_Value;}private void vlcControl1_Stopped(object sender, Vlc.DotNet.Core.VlcMediaPlayerStoppedEventArgs e){button_play.BackgroundImage = Properties.Resources.audioPause2;}private void lTrackBar_vedio_MouseMove(object sender, MouseEventArgs e){PlayInNewLocation(sender,e);}private void lTrackBar_vedio_MouseDown(object sender, MouseEventArgs e){PlayInNewLocation(sender,e);}private void PlayInNewLocation(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){if (vlcControl1.State == Vlc.DotNet.Core.Interops.Signatures.MediaStates.Ended){InitVedio();}vlcControl1.VlcMediaPlayer.Time = this.lTrackBar_vedio.L_Value * vedioLength / (lTrackBar_vedio.L_Maximum - lTrackBar_vedio.L_Minimum);}}private void button1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left)vlcControl1.Rate = 2.5f;}private void button1_MouseUp(object sender, MouseEventArgs e){vlcControl1.Rate = 1;}private void Form1_FormClosed(object sender, FormClosedEventArgs e){// vlcControl在stop的过程中可能会产生子窗口消息,然而子窗口消息是在主线程(UI线程)中处理的,而stop()方法也是在主线程中调用的,这就造成了竞争性死锁。所以先释放掉主窗体,在释放vlcControlthis.Dispose();if (vlcControl1.State != Vlc.DotNet.Core.Interops.Signatures.MediaStates.Stopped)vlcControl1.Stop();vlcControl1.Dispose();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418565.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时&#xff0c;时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一&#xff0c;该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍&#xff0c;本篇文章将详尽阐明导致该问题的根本原因&…

Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】

前言 最近在假期实训&#xff0c;但是实在水的不行&#xff0c;三天要学完SSM&#xff0c;实在一言难尽&#xff0c;浪费那时间干什么呢。SSM 之前学了一半&#xff0c;等后面忙完了&#xff0c;再去好好重学一遍&#xff0c;毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…

Pandas.Series.count() 非空单元格计数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

对象数组变成一维数组,导出txt文件

假设对象数组格式为此 arr1: [{id: 1,title: 我是1目录,children: [{id: 11,title: 我是1-1目录,children: [{id: 111,title: 我是1-1-1目录,children: [],},],},],},{id: 2,title: 我是2目录,children: [{id: 21,title: 我是2-1目录,children: [],},],},], 页面如下 先在页面…

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

接口测试与数据驱动 1简介 数据驱动测试&#xff0c;即是分离测试逻辑与测试数据&#xff0c;通过如excel表格的形式来保存测试数据&#xff0c;用测试脚本读取并执行测试的过程。 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程&#xff0…

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…

25计算机考研408专业课复习计划

点击蓝字&#xff0c;关注我们 今天要分享的是25计算机考研408专业课复习计划。 以下内容供大家参考&#xff0c;大家要根据自己的复习情况进行适当调整。 统考与自命题 统考科目是指计算机学科专业基础综合&#xff08;408&#xff09;&#xff0c;满分150分&#xff0c;试…

【Kafka】Linux本地和Docker安装Kafka

目录 Linux本地安装kafkajava环境配置Zookeeper的安装配置Kafka的安装与配置生产与消费 Docker安装kafkaZookeeper安装Kafka安装 Linux本地安装kafka java环境配置 1、上传jdk-8u261-linux-x64.rpm到服务器并安装&#xff1a; rpm -ivh jdk-8u261-linux-x64.rpm2、配置环境变…

【Qt开发】初识Qt

文章目录 1. Qt的背景1.1 Qt是什么1.2 Qt的发展史1.3 Qt支持的平台 2. Qt开发环境的搭建2.1 Qt SDK下载2.2 Qt SDK的安装 3. 一个简单的Qt模板程序的创建4. Qt模板程序的代码讲解4.1 main.cpp4.2 widget.h4.3 widget.cpp4.4 widget.ui4.5 test_1_18.pro4.6 一些中间文件 5. Qt在…

ASP.NET Core 对象池化技术

写在前面 Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分&#xff0c;当对象的初始化成本较高&#xff0c;并且可能被频繁使用时&#xff0c;才适合采用对象池技术&#xff1b;被ObjectPool管理的对象不会进入垃圾回收&#xff0c;使用时通过由实例对象实…

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......

手把手教你如何快速定位bug,如何编写测试用例,快来观摩......手把手教你如何快速定位bug,如何编写测试用例,快来观摩......作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xf…

解决Spring Boot跨域问题(配置JAVA类)

什么是跨域问题 跨域问题指的是不同端口之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 比如前端用的端口号为8081&#xff0c;后端用的端口号为8080&#xff0c;后…