用C#和WinForms打造你的专属视频播放器:从多格式支持到全屏播放的完整指南
使用 C# 和 WinForms 创建一个功能齐全的视频播放器,支持 MP4 和 AVI 格式,并具有文件夹导入、多视频播放、全屏切换、视频列表管理等功能,是一个相对复杂的项目。下面我会给出一个基本的实现方案,包括所需的关键功能和相关代码示例。
1. 创建 WinForms 应用程序
首先,创建一个新的 WinForms 项目。在 Visual Studio 中,选择 “创建新项目”,然后选择 “Windows 窗体应用 (.NET Framework)” 或 “Windows 窗体应用 (.NET Core)”。
2. 安装必要的 NuGet 包
为了播放视频,我们需要一个支持 MP4 和 AVI 的视频播放器组件。VLC.DotNet
是一个不错的选择,它是基于 VLC 媒体播放器的封装。
打开 NuGet 包管理器控制台,然后运行以下命令来安装 VLC.DotNet
包:
Install-Package Vlc.DotNet.Forms
3. 设计界面
在 WinForms 设计器中,添加以下控件:
Panel
用于显示视频。ListBox
用于显示视频列表。Button
用于导入视频文件夹。ContextMenuStrip
用于右键菜单操作(添加、删除视频)。Button
用于全屏切换。
4. 实现功能
4.1. 初始化 VLC 播放器
在代码中初始化 VLC 播放器并配置它。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Vlc.DotNet.Forms;
using Vlc.DotNet.Core;namespace VideoPlayer
{public partial class MainForm : Form{private VlcControl vlcControl;private List<string> videoFiles = new List<string>();private int currentIndex = -1;public MainForm(){InitializeComponent();InitializeVlcControl();}private void InitializeVlcControl(){vlcControl = new VlcControl();vlcControl.Dock = DockStyle.Fill;vlcControl.VlcLibDirectory = new System.IO.DirectoryInfo(@"C:\Program Files\VideoLAN\VLC"); // VLC 安装路径vlcControl.EndInit();this.Controls.Add(vlcControl);}}
}
4.2. 导入视频文件夹
添加文件夹导入功能,将选定文件夹中的所有视频添加到列表中。
private void btnImportFolder_Click(object sender, EventArgs e)
{using (var folderDialog = new FolderBrowserDialog()){if (folderDialog.ShowDialog() == DialogResult.OK){var files = System.IO.Directory.GetFiles(folderDialog.SelectedPath, "*.*", System.IO.SearchOption.AllDirectories);foreach (var file in files){if (file.EndsWith(".mp4") || file.EndsWith(".avi")){videoFiles.Add(file);listBoxVideos.Items.Add(file);}}}}
}
4.3. 播放视频
播放选定的视频,并支持全屏模式切换。
private void PlayVideo(string filePath)
{vlcControl.SetMedia(new Uri(filePath));vlcControl.Play();this.Text = System.IO.Path.GetFileName(filePath);
}private void listBoxVideos_SelectedIndexChanged(object sender, EventArgs e)
{if (listBoxVideos.SelectedItem != null){PlayVideo(listBoxVideos.SelectedItem.ToString());}
}private void btnFullscreen_Click(object sender, EventArgs e)
{this.FormBorderStyle = FormBorderStyle.None;this.WindowState = FormWindowState.Maximized;vlcControl.Dock = DockStyle.Fill;
}
4.4. 右键菜单操作
添加右键菜单功能以支持视频的添加和删除。
private void listBoxVideos_MouseUp(object sender, MouseEventArgs e)
{if (e.Button == MouseButtons.Right){var index = listBoxVideos.IndexFromPoint(e.Location);if (index != ListBox.NoMatches){listBoxVideos.SelectedIndex = index;contextMenuStrip1.Show(listBoxVideos, e.Location);}}
}private void addVideoToolStripMenuItem_Click(object sender, EventArgs e)
{// 实现视频添加功能
}private void deleteVideoToolStripMenuItem_Click(object sender, EventArgs e)
{if (listBoxVideos.SelectedItem != null){videoFiles.Remove(listBoxVideos.SelectedItem.ToString());listBoxVideos.Items.Remove(listBoxVideos.SelectedItem);}
}
4.5. 拖放调整视频顺序
支持通过拖放操作调整视频顺序。
private void listBoxVideos_DragOver(object sender, DragEventArgs e)
{e.Effect = DragDropEffects.Move;
}private void listBoxVideos_DragDrop(object sender, DragEventArgs e)
{var point = listBoxVideos.PointToClient(new Point(e.X, e.Y));var index = listBoxVideos.IndexFromPoint(point);if (index >= 0 && index < listBoxVideos.Items.Count){var selectedItem = (string)listBoxVideos.SelectedItem;videoFiles.Remove(selectedItem);videoFiles.Insert(index, selectedItem);listBoxVideos.Items.Remove(selectedItem);listBoxVideos.Items.Insert(index, selectedItem);listBoxVideos.SelectedIndex = index;}
}
5. 代码整理
确保将以上功能模块整合到你的 Form 类中,并进行适当的 UI 布局调整。
6. 测试和调试
完成以上步骤后,进行充分的测试,确保所有功能正常运行。测试包括:
- 视频播放是否流畅
- 文件夹导入功能是否正常
- 全屏切换是否有效
- 视频列表的添加、删除和拖放功能是否按预期工作
总结
这个示例代码涵盖了一个基本的视频播放器的实现,包括导入、播放、全屏、列表管理等功能。你可以根据需要进一步扩展功能或改进界面。
相关文章:
用C#和WinForms打造你的专属视频播放器:从多格式支持到全屏播放的完整指南
使用 C# 和 WinForms 创建一个功能齐全的视频播放器,支持 MP4 和 AVI 格式,并具有文件夹导入、多视频播放、全屏切换、视频列表管理等功能,是一个相对复杂的项目。下面我会给出一个基本的实现方案,包括所需的关键功能和相关代码示…...

Spring security学习笔记
目录 1. 概要2. spring security原理2.1 DelegatingFilterProxy2.2 FilterChainProxy2.3 SecurityFilterChain2.4 Spring Security 作用机制 3.Spring Security快速入门4.高级自定义配置5. Spring Security 结合 JWT使用 1. 概要 Spring Security是一个用于在Java应用程序中实…...

MySQL:基础增删查改
MySQL:基础增删查改 插入插入冲突 查询distinctwhereorder bylimit 删除deletetruncate 更新 插入 基本插入语法: insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应如果插入时数据完全…...
Apache DolphinScheduler 1.3.4升级至3.1.2版本过程中的踩坑记录
因为在工作中需要推动Apache DolphinScheduler的升级,经过预研,从1.3.4到3.1.2有的体验了很大的提升,在性能和功能性有了很多的改善,推荐升级。 查看官方的升级文档,可知有提供升级脚本,如果只是跨小版本的…...
最后一块石头的重量(超级妙的背包问题)
1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果…...
如何评估和提升审查者在前端代码审查中的专业技能?
评估和提升审查者在前端代码审查中的专业技能可以通过以下步骤: 技能评估: 定期进行技能评估,了解审查者在前端开发各方面的能力,包括但不限于HTML、CSS、JavaScript、框架使用、代码规范等。 代码审查实践: 通过实…...

C++(区别于C的)基础内容总结
参考: C 教程 | 菜鸟教程 (runoob.com) 简介 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言,最初命名为带类的C&…...
实现代码灵活性:用Roslyn动态编译和执行存储在数据库中的C#代码
在许多现代应用程序中,动态编译和执行代码是提升灵活性和功能的一种强大技术。本文将介绍如何使用Roslyn编译器平台动态编译和执行存储在数据库中的C#代码,并结合实际公司案例来说明这些技术的应用场景。 1. 引言 在很多应用场景中,我们可能…...
探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
探索哈希表:C中的实现与操作详解 介绍 哈希表(Hash Table)是一种常见的数据结构,它提供了一种高效的键值对存储方式,能够快速进行插入、删除和查找操作。在这篇博客中,我们将详细介绍哈希表的概念、在C中的…...

Python酷库之旅-第三方库Pandas(062)
目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …...

python学习之旅(基础篇看这篇足够了!!!)
目录 前言 1.输入输出 1.1 输入 1.2 输出 2. 变量与常量 2.1 变量 2.2 常量 2.3 赋值 2.4格式化输出 3. 数据类型 4. 四则运算 5.“真与假” 5.1 布尔数 5.2 比较运算和逻辑运算 5.3 布尔表达式 6.判断语句 6.1 基本的if语句 6.2 if-else语句 6.3 if-elif-el…...

Azure OpenAI Embeddings vs OpenAI Embeddings
题意:Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景: Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…...

重生奇迹MU职业成长三步走
在重生奇迹MU游戏中,转职是最重要的玩法之一。每个职业在转职后都会发生巨大的变化,经过三次转职后,你才有资格成为该游戏中最强大的冒险者。 一转,一切才刚刚开始 玩家完成第一次转职任务后,标志着我们成功度过了游…...

2024年中国数据中台行业研究报告
数据中台丨研究报告 核心摘要: 数据中台是企业数字化建设的重要构成,其通过整合企业基础设施和数据能力,实现数据资产化和服务复用,降低运营成本,支撑业务创新。受宏观经济影响,部分企业减少了对数据中台等…...

MySQL——数据表的基本操作(一)创建数据表
数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表。需要注意的是,在操作数据表之前,应该使用 “ USE 数据库名 ” 指定操作是在哪个数据库中进行,否则会抛出 “ No database selected ” 错误。创建数据表…...

EPLAN EDZ 文件太大导入很慢如何解决?
目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…...
刷题——缺失的第一个正整数
缺失的第一个正整数_牛客题霸_牛客网 我选择了一个我比较能看懂的, int minNumberDisappeared(vector<int>& nums) {// write code heremap<int, int>hash;int n nums.size();//哈希表记录数组中出现的每个数字for(int i 0; i < n; i)hash[n…...
代理设置--一些库的代理设置
首先最好能获取一个免费代理,来继续下面的阅读和实验 也可以在本机设置代理,具体流程由于比较敏感,请自行搜索 代理设置成功后的测试网站是 http://www.httpbin.org/get , 访问该链接可以得到请求相关的信息,返回结果中的 ori…...
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤 一、账号需要的权限二、创建账号,赋予登陆、复制权限三、赋予账号数据库权限四、赋予账号对表的权限五、创建PostgreSQL数据库复制组六、账号权限授予完整案例七、扩展——分区表设置八、扩展-撤销账号的权限…...

javascript:判断输入值是数字还是字母
1 代码示例 要判断输入值是数字还是字母,我们可以通过JavaScript获取输入框的值,然后使用isNaN函数来检查输入值是否为数字。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><s…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

VSCode 没有添加Windows右键菜单
关键字:VSCode;Windows右键菜单;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意,实际使用的时候发现 VSCode 在 Windows 菜单栏…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...