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
相关产品推荐
相关产品推荐

