音视频播放
开发专题 · Windows Media Player COM(.NET Framework 4.8)
本页说明在 .NET Framework 4.8 窗体项目中播放本地音视频:优先使用操作系统自带的 Windows Media Player COM 组件(经互操作程序集调用),并补充纯框架的 SoundPlayer(仅 WAV)。目标框架以 LCode 默认的 .NET 4.8 为准;示例面向 C# 5.0 与 VB.NET(勿用 C# 6+ 语法如字符串插值、nameof)。操作文案以 LCode 中文界面为准。添加引用通用步骤见 引用 DLL。
选用哪种方式
| 方式 | 程序集 / 组件 | 适用 |
|---|---|---|
| Windows Media Player(COM,推荐) | 系统 wmp.dll → 互操作 WMPLib(工程内常生成 Interop.WMPLib);嵌入窗体时另需 AxWMPLib.AxWindowsMediaPlayer |
常见本地音频/视频(依本机解码器)。不必引入第三方播放库 |
System.Media.SoundPlayer |
System(框架自带) |
仅 WAV;无视频、无进度条控件。适合短提示音 |
| 第三方播放器 / WebView2 HTML5 | 另引 DLL,或见 WebView2 | 编解码要求特殊时再考虑;本页不展开 |
提示:.NET Framework 本身没有通用「万能音视频控件」;WinForms 场景下用系统 WMP COM 是常见的内置路径。LCode 工具箱未预置 Windows Media Player ActiveX 项——通过「添加引用 → COM」引入类型库后,用代码创建播放器(无界面或 Ax 控件)。
在 LCode 中添加 COM 引用
按 窗体应用入门 建好「Windows 应用程序」后:
- 在项目浏览器中选中窗体项目(或展开其下的引用节点)。
- 右键项目(或「引用」)→ 添加引用;也可菜单 项目 → 添加引用。
- 切换到 COM 页签。列表列标题为名称、路径。
- 在列表中找到 Windows Media Player(路径通常指向本机
wmp.dll,如C:\Windows\System32\wmp.dll)。若名称略有差异,以本机已注册类型库为准。 - 选中后点 选择(E),确认右侧「选择引用」出现该项,再确定。
- 菜单 编译 → 编译解决方案(F8)。成功后工程会通过 COM 互操作得到
WMPLib命名空间(编译消息可能出现「创建COM互操作程序集…」)。
| 界面 / 项 | 说明 |
|---|---|
| 添加引用 → COM | 从本机已注册类型库添加 COM 引用(LCode 侧栏页签文案为「COM」) |
| 名称 / 路径 | COM 列表两列;选 Windows Media Player,路径指向 wmp.dll |
| 选择(E) | 把当前项加入「选择引用」列表 |
| 本地复制 / 嵌入互操作(interop)类型 | COM 互操作程序集可按需设本地复制;也可在引用属性中启用「嵌入互操作(interop)类型」以减小部署体积 |
提示:LCode 主界面 NuGet 包管理暂不支持,待更新完善——本页不依赖 NuGet。若 COM 列表中没有 Windows Media Player,说明本机未安装/未注册 WMP(少见;部分精简系统可能缺组件),需先在操作系统侧恢复媒体功能后再引用。
DLL 与程序集说明
| 名称 | 角色 | 如何得到 |
|---|---|---|
wmp.dll |
系统原生 Windows Media Player COM 实现 | 随 Windows 安装;勿拷入工程当普通托管 DLL 引用 |
Interop.WMPLib.dll(命名空间 WMPLib) |
托管互操作包装;提供 WindowsMediaPlayer 等类型 |
LCode「添加引用 → COM」后由构建生成/引用;也可在开发机用 tlbimp 生成后按 引用 DLL 浏览添加 |
AxInterop.WMPLib.dll(命名空间 AxWMPLib) |
WinForms ActiveX 包装;提供可嵌入窗体的 AxWindowsMediaPlayer |
LCode 不会在仅添加 COM 引用时自动生成。在已装 .NET SDK / 开发工具的机器上对 wmp.dll 运行 aximp(如 aximp %windir%\System32\wmp.dll),再把生成的 Ax 互操作程序集浏览引用进工程,并保证与 WMPLib 匹配 |
注意:目标平台(x86 / x64 / AnyCPU)须与本机可加载的 WMP 位数一致,否则运行时可能出现 COM 创建失败。调试时若 64 位进程加载异常,可先将工程平台改为 x86 验证。详见 运行与编译。
常用成员(WMPLib)
| 成员 | 类型 | 说明 |
|---|---|---|
URL |
属性 | 媒体路径或地址(本地文件路径或 URL) |
controls.play / pause / stop |
方法 | 播放、暂停、停止 |
controls.currentPosition |
属性 | 当前播放位置(秒) |
settings.volume |
属性 | 音量 0–100 |
settings.mute |
属性 | 是否静音 |
playState |
属性 | 播放状态枚举(未就绪、播放中、暂停、停止等) |
AxWindowsMediaPlayer.Ctlcontrols |
属性 | 嵌入式 Ax 控件上的控制接口(对应非 Ax 的 controls) |
uiMode(Ax) |
属性 | 界面模式,如 full / mini / none / invisible |
最小播放示例(WMPLib,无界面)
仅添加 COM 引用即可编译。适合音频或「只播不嵌控件」;视频画面不会出现在窗体上(系统可能弹出/占用 WMP 窗口,视版本与设置而定)。在窗体上放按钮 btnPlay、btnStop,路径改成你的媒体文件。
C#
using System;
using System.Windows.Forms;
using WMPLib;
public partial class Form1 : Form
{
private WindowsMediaPlayer player;
public Form1()
{
InitializeComponent();
player = new WindowsMediaPlayer();
player.settings.autoStart = false;
player.settings.volume = 80;
}
private void btnPlay_Click(object sender, EventArgs e)
{
// 换成实际文件;也可是 http(s) 流地址(视本机编解码而定)
player.URL = @"C:\Media\demo.mp3";
player.controls.play();
}
private void btnStop_Click(object sender, EventArgs e)
{
player.controls.stop();
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
if (player != null)
{
player.controls.stop();
player.close();
player = null;
}
base.OnFormClosed(e);
}
}
VB.NET
Imports System.Windows.Forms
Imports WMPLib
Public Class Form1
Private player As WindowsMediaPlayer
Public Sub New()
InitializeComponent()
player = New WindowsMediaPlayer()
player.settings.autoStart = False
player.settings.volume = 80
End Sub
Private Sub btnPlay_Click(sender As Object, e As EventArgs) Handles btnPlay.Click
' 换成实际文件;也可是 http(s) 流地址(视本机编解码而定)
player.URL = "C:\Media\demo.mp3"
player.controls.play()
End Sub
Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
player.controls.stop()
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
If player IsNot Nothing Then
player.controls.stop()
player.close()
player = Nothing
End If
MyBase.OnFormClosed(e)
End Sub
End Class
嵌入窗体(AxWindowsMediaPlayer)
需要在窗体内显示播放器界面时,引用 AxWMPLib(见上文 aximp),再在代码中创建控件。LCode 设计器工具箱暂不支持一键拖入该 ActiveX(「选择工具箱项 / COM 组件」向导暂不支持,待更新完善),请用代码添加。
C#
using System;
using System.ComponentModel;
using System.Windows.Forms;
using AxWMPLib;
public partial class Form1 : Form
{
private AxWindowsMediaPlayer axPlayer;
public Form1()
{
InitializeComponent();
axPlayer = new AxWindowsMediaPlayer();
((ISupportInitialize)axPlayer).BeginInit();
axPlayer.Name = "axPlayer";
axPlayer.Dock = DockStyle.Fill;
Controls.Add(axPlayer);
((ISupportInitialize)axPlayer).EndInit();
axPlayer.uiMode = "full";
}
private void btnPlay_Click(object sender, EventArgs e)
{
axPlayer.URL = @"C:\Media\demo.mp4";
axPlayer.Ctlcontrols.play();
}
}
VB.NET
Imports System.ComponentModel
Imports System.Windows.Forms
Imports AxWMPLib
Public Class Form1
Private axPlayer As AxWindowsMediaPlayer
Public Sub New()
InitializeComponent()
axPlayer = New AxWindowsMediaPlayer()
CType(axPlayer, ISupportInitialize).BeginInit()
axPlayer.Name = "axPlayer"
axPlayer.Dock = DockStyle.Fill
Controls.Add(axPlayer)
CType(axPlayer, ISupportInitialize).EndInit()
axPlayer.uiMode = "full"
End Sub
Private Sub btnPlay_Click(sender As Object, e As EventArgs) Handles btnPlay.Click
axPlayer.URL = "C:\Media\demo.mp4"
axPlayer.Ctlcontrols.play()
End Sub
End Class
仅 WAV:SoundPlayer
不引入 COM 时,可用框架自带的 System.Media.SoundPlayer 播本地 WAV。
C#
using System.Media;
using (SoundPlayer sp = new SoundPlayer(@"C:\Media\beep.wav"))
{
sp.Play(); // 异步;同步用 PlaySync()
}
VB.NET
Imports System.Media
Using sp As New SoundPlayer("C:\Media\beep.wav")
sp.Play() ' 异步;同步用 PlaySync()
End Using
注意事项
| 主题 | 说明 |
|---|---|
| 编解码 | 能否播取决于本机 Windows Media 组件与已装解码器,不是 .NET 保证的格式全集。 |
| 平台位数 | COM 加载失败时优先核对 x86/x64 与「首选 32 位」等工程设置。 |
| 释放 | 窗体关闭时 stop / close,避免后台继续出声。 |
| UI 线程 | 短本地文件一般可在按钮事件中直接 play;若自定义缓冲/网络流导致卡顿,再结合 异步、同步与多线程 处理。 |
| C# 语言版本 | LCode / .NET 4.8 按 C# 5.0:勿用 $"…"、nameof、?. 等。 |