在C# WinForm项目中实现多个视频循环播放,是很多桌面应用开发中的常见需求,下面我们先来看实现效果对应的基础配置,再逐步讲解代码逻辑。

环境准备与控件添加
首先需要确保项目中已经添加了Windows Media Player的COM组件,具体操作步骤如下:
- 右键项目引用,选择添加引用,切换到COM选项卡
- 找到Windows Media Player,勾选后点击确定,会在工具箱中出现AxWindowsMediaPlayer控件
- 将AxWindowsMediaPlayer控件拖入WinForm窗体,命名为axWindowsMediaPlayer1
核心实现逻辑
多视频循环播放的核心逻辑分为三个部分:视频列表管理、播放状态监听、循环切换控制,下面分别讲解每个部分的实现方式。
1. 视频列表管理
我们需要先维护一个视频文件路径的列表,用来存储所有需要播放的视频地址,同时用一个索引变量记录当前播放的视频位置。
// 视频文件路径列表
private List<string> videoPaths = new List<string>();
// 当前播放的视频索引
private int currentVideoIndex = 0;
/// <summary>
/// 初始化视频列表
/// </summary>
private void InitVideoList()
{
// 添加需要播放的视频路径,实际开发中可以从配置文件或文件夹读取
videoPaths.Add(@"D:\Videos\video1.mp4");
videoPaths.Add(@"D:\Videos\video2.mp4");
videoPaths.Add(@"D:\Videos\video3.mp4");
}2. 播放状态监听
需要监听AxWindowsMediaPlayer的播放状态变化,当当前视频播放结束时,自动切换到下一个视频,这里我们使用PlayStateChange事件来实现。
/// <summary>
/// AxWindowsMediaPlayer播放状态变化事件
/// </summary>
private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
// 播放状态为媒体结束
if (e.newState == 8)
{
// 切换到下一个视频
PlayNextVideo();
}
}3. 循环切换控制
切换视频时需要判断当前索引是否超出列表范围,如果超出则重置为0,实现循环播放的效果,同时可以设置播放参数。
/// <summary>
/// 播放下一个视频
/// </summary>
private void PlayNextVideo()
{
currentVideoIndex++;
// 如果索引超出列表长度,重置为0,实现循环
if (currentVideoIndex >= videoPaths.Count)
{
currentVideoIndex = 0;
}
// 设置播放路径并开始播放
axWindowsMediaPlayer1.URL = videoPaths[currentVideoIndex];
axWindowsMediaPlayer1.Ctlcontrols.play();
}
/// <summary>
/// 开始播放第一个视频
/// </summary>
private void StartPlay()
{
if (videoPaths.Count == 0)
{
MessageBox.Show("没有可播放的视频文件");
return;
}
axWindowsMediaPlayer1.URL = videoPaths[currentVideoIndex];
axWindowsMediaPlayer1.Ctlcontrols.play();
}完整窗体代码整合
下面是整合了所有逻辑的完整窗体代码,直接在WinForm窗体类中替换即可使用。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using AxWMPLib;
namespace VideoLoopPlayDemo
{
public partial class MainForm : Form
{
private List<string> videoPaths = new List<string>();
private int currentVideoIndex = 0;
public MainForm()
{
InitializeComponent();
// 绑定播放状态变化事件
axWindowsMediaPlayer1.PlayStateChange += axWindowsMediaPlayer1_PlayStateChange;
}
private void MainForm_Load(object sender, EventArgs e)
{
InitVideoList();
StartPlay();
}
private void InitVideoList()
{
videoPaths.Add(@"D:\Videos\video1.mp4");
videoPaths.Add(@"D:\Videos\video2.mp4");
videoPaths.Add(@"D:\Videos\video3.mp4");
}
private void StartPlay()
{
if (videoPaths.Count == 0)
{
MessageBox.Show("没有可播放的视频文件");
return;
}
axWindowsMediaPlayer1.URL = videoPaths[currentVideoIndex];
axWindowsMediaPlayer1.Ctlcontrols.play();
}
private void axWindowsMediaPlayer1_PlayStateChange(object sender, _WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 8)
{
PlayNextVideo();
}
}
private void PlayNextVideo()
{
currentVideoIndex++;
if (currentVideoIndex >= videoPaths.Count)
{
currentVideoIndex = 0;
}
axWindowsMediaPlayer1.URL = videoPaths[currentVideoIndex];
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
}常见问题与优化
在实际使用中可能会遇到一些问题,下面给出对应的优化方案:
- 如果视频切换时出现黑屏,可以在切换前先调用
axWindowsMediaPlayer1.Ctlcontrols.stop()停止当前播放,再设置新的URL - 如果需要支持动态添加视频,可以在添加后重新校验索引范围,避免索引越界
- 如果需要调整播放顺序,可以修改videoPaths列表的顺序,或者增加随机播放的逻辑,通过随机数生成索引即可
以上就是在C# WinForm中实现多个视频循环播放的完整方案,代码可直接复用,开发者可以根据实际需求调整视频路径和播放逻辑。
C#_WinForm视频循环播放AxWindowsMediaPlayer多线程Timer控件修改时间:2026-05-29 03:44:26