You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP:如何使用Windows.Media.Playback.MediaPlayer播放音频CD

使用MediaPlayer播放音频CD轨道的可行方案

可行性说明

完全可以用Windows.Media.Playback.MediaPlayer播放音频CD轨道,但不能直接使用.cda文件路径或第三方库的自定义协议(如cdda:///),因为MediaPlayer依赖WinRT的存储API来处理CD的底层读取逻辑。

实现步骤及代码示例

1. 声明必要的应用权限

如果是UWP应用,需要在Package.appxmanifest中添加光盘访问权限:

<Capabilities>
  <DeviceCapability Name="opticalDisc" />
</Capabilities>

桌面应用(WPF/WinForms)需确保项目已启用WinRT API访问(.NET 5+默认支持,旧版本需手动添加Windows SDK引用)。

2. 获取CD驱动器并枚举轨道

通过WinRT的存储API定位CD驱动器,获取轨道文件后直接传入MediaPlayer:

using Windows.Media.Playback;
using Windows.Storage;
using Windows.Devices.Enumeration;

// 查找系统中的CD/DVD驱动器
var discSelector = StorageDevice.GetDeviceSelector(StorageDeviceType.OpticalDisc);
var discDevices = await DeviceInformation.FindAllAsync(discSelector);

if (discDevices.Count == 0)
{
    // 无可用CD驱动器
    return;
}

// 获取第一个CD驱动器的存储文件夹
var cdDevice = await StorageDevice.FromIdAsync(discDevices[0].Id);
var cdFolder = cdDevice.Folder;

// 按名称排序获取所有CD轨道(.cda文件)
var cdTracks = await cdFolder.GetFilesAsync(CommonFileQuery.OrderByName);

if (cdTracks.Count == 0)
{
    // CD中无音频轨道
    return;
}

// 初始化MediaPlayer并播放第一个轨道
var mediaPlayer = new MediaPlayer();
await mediaPlayer.SetSourceAsync(cdTracks[0]);
mediaPlayer.Play();

为什么之前的尝试失败

  • 直接使用E:\Track01.cda路径:.cda文件仅为CD轨道的索引占位符,不包含实际音频数据,MediaPlayer无法通过本地URI直接解析,必须通过StorageFile API让系统处理CD的底层读取。
  • 使用cdda:///E:/协议:这是libvlc的自定义协议,MediaPlayer不支持第三方协议,仅识别系统标准URI格式。

额外提示

如果仍需临时解决MCI_CLOSE异常问题,可尝试确保播放完全停止后再调用关闭接口,或检查是否存在未释放的MCI设备句柄,但微软已明确标记MCI为遗留API,建议优先迁移到MediaPlayer。

内容的提问来源于stack exchange,提问作者Paul Wheatley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:42:41