如何通过编程方式向Windows Media Player播放列表添加音乐?
向运行中的Windows Media Player 12添加媒体文件
问题背景
我编写了一个小型Python脚本,可启动Windows Media Player并播放动态生成的、满足随机选择且时长固定要求的音乐文件列表,目前运行正常。启动命令为:wmplayer.exe file1.mp3 file2.mp3 /Task MediaLibrary
对应的Python代码:
import subprocess wmplayer_path = "C:\\Program Files (x86)\\Windows Media Player\\wmplayer.exe" playlist = ["file1.mp3", "file2.mp3"] # 示例动态生成列表 subprocess.Popen( [ wmplayer_path, *playlist, "/Task", "MediaLibrary", ], stdin=None, stdout=None, stderr=None, )
现在需要在播放器运行时向现有播放列表添加更多音乐,但尝试官方命令行参数及未公开的/Enqueue选项均无效。UI中右键菜单的“Add to Windows Media Player list”可实现该操作,但需通过编程(CLI或Python/C# API)方式解决,当前环境为Windows 10 Pro 64位、WMP 12。
解决方案
1. 使用Windows Media Player COM API(推荐)
WMP提供了COM接口,可直接操控运行中的实例,这是最可靠的追加方式。
Python实现(依赖pywin32库)
首先安装依赖:pip install pywin32
代码示例:
import win32com.client def add_to_wmp_playlist(file_path): try: # 获取已运行的WMP实例 wmp = win32com.client.GetActiveObject("WMPlayer.OCX.7") # 获取当前播放列表并追加媒体文件 current_playlist = wmp.currentPlaylist media_item = wmp.newMedia(file_path) current_playlist.appendItem(media_item) print(f"已添加文件: {file_path}") except Exception as e: print(f"添加失败: {str(e)}") # 单个文件添加调用 add_to_wmp_playlist("C:\\music\\new_track.mp3") # 批量添加示例 def bulk_add_to_wmp(file_paths): try: wmp = win32com.client.GetActiveObject("WMPlayer.OCX.7") current_playlist = wmp.currentPlaylist for path in file_paths: media_item = wmp.newMedia(path) current_playlist.appendItem(media_item) print(f"已批量添加 {len(file_paths)} 个文件") except Exception as e: print(f"批量添加失败: {str(e)}") bulk_add_to_wmp(["C:\\music\\track1.mp3", "C:\\music\\track2.mp3"])
C#实现
首先添加COM引用:右键项目 → 添加引用 → COM → 选择"Windows Media Player"。
代码示例:
using WMPLib; public static void AddToWmpPlaylist(string filePath) { try { // 获取运行中的WMP实例 WindowsMediaPlayer wmp = (WindowsMediaPlayer)System.Runtime.InteropServices.Marshal.GetActiveObject("WMPlayer.OCX.7"); IWMPPlaylist currentPlaylist = wmp.currentPlaylist; IWMPMedia media = wmp.newMedia(filePath); currentPlaylist.appendItem(media); System.Console.WriteLine($"已添加文件: {filePath}"); } catch (System.Exception ex) { System.Console.WriteLine($"添加失败: {ex.Message}"); } } // 调用示例 AddToWmpPlaylist(@"C:\music\new_track.mp3"); // 批量添加示例 public static void BulkAddToWmp(System.Collections.Generic.List<string> filePaths) { try { WindowsMediaPlayer wmp = (WindowsMediaPlayer)System.Runtime.InteropServices.Marshal.GetActiveObject("WMPlayer.OCX.7"); IWMPPlaylist currentPlaylist = wmp.currentPlaylist; foreach (string path in filePaths) { IWMPMedia media = wmp.newMedia(path); currentPlaylist.appendItem(media); } System.Console.WriteLine($"已批量添加 {filePaths.Count} 个文件"); } catch (System.Exception ex) { System.Console.WriteLine($"批量添加失败: {ex.Message}"); } }
2. CLI替代方案(临时播放列表文件)
若不想使用COM API,可生成包含现有列表+新文件的WPL格式临时播放列表,再让WMP加载。但此方式会替换当前播放列表,而非追加:
生成临时WPL文件(示例内容):
<?wpl version="1.0"?> <smil> <head> <meta name="Generator" content="Windows Media Player"/> <title>临时播放列表</title> </head> <body> <seq> <!-- 现有播放列表中的文件 --> <media src="C:\music\existing1.mp3"/> <media src="C:\music\existing2.mp3"/> <!-- 要添加的新文件 --> <media src="C:\music\new1.mp3"/> <media src="C:\music\new2.mp3"/> </seq> </body> </smil>
运行命令加载:wmplayer.exe /Open "C:\temp\temp_playlist.wpl"
注意事项
- 使用COM API时,需确保WMP已处于运行状态,否则
GetActiveObject会报错;若需处理未运行场景,可先启动WMP再执行追加操作。 - 传递给COM接口的文件路径必须为绝对路径,不支持相对路径。
- Windows 10 Pro 64位环境下的WMP 12完全兼容上述COM接口,无需额外配置。
内容的提问来源于stack exchange,提问作者akinuri
相关产品推荐
相关产品推荐

