如何通过Python VLC获取树莓派CD播放器的CD元数据?
解决Python VLC获取CD元数据(CD-TEXT)的问题
问题分析
你的代码中获取元数据失败主要有几个核心原因:
- 调用
MEDIA.parse()后立即读取元数据,VLC的CD解析是异步操作,此时元数据还未加载完成 - 初始化VLC实例时未启用CD-TEXT相关支持模块,导致无法识别CD中的元数据信息
- 单独创建的
MEDIA对象和正在播放的媒体列表无关联,无法获取当前播放CD的有效元数据
修正方案
1. 初始化VLC实例时开启CD-TEXT支持
创建实例时添加参数,强制启用CD解析相关模块:
instance = vlc.Instance("--no-xlib", "--cdraw-enabled", "--cdtext-enabled")
2. 等待元数据解析完成
VLC的parse()是异步执行的,必须等待解析状态完成后再读取元数据,可通过循环检查is_parsed()状态实现:
# 树莓派设备路径为cdda:///dev/sr0,Windows替换为对应盘符如cdda:///E:/ media = instance.media_new("cdda:///E:/") media.parse() # 等待解析完成 while not media.is_parsed(): time.sleep(0.1)
3. 直观获取元数据字段
使用VLC内置的元数据枚举值替代数字索引,可读性更强:
# 遍历常用元数据字段 meta_fields = [vlc.Meta.Title, vlc.Meta.Artist, vlc.Meta.Album, vlc.Meta.Genre, vlc.Meta.TrackNumber] for field in meta_fields: value = media.get_meta(field) if value: print(f"{vlc.Meta(field).name}: {value}") # 或者遍历所有元数据索引 for i in range(vlc.Meta.NumberOfValues): value = media.get_meta(i) if value: print(f"{i} - {vlc.Meta(i).name}: {value}")
4. 关联正在播放的媒体列表获取元数据
若要获取当前播放列表中CD的元数据,直接从medialist中提取对应媒体对象即可:
# 从媒体列表中获取CD媒体对象 cd_media = medialist.item_at_index(0) cd_media.parse() while not cd_media.is_parsed(): time.sleep(0.1) # 读取元数据 print("=== CD元数据 ===") for i in range(vlc.Meta.NumberOfValues): meta_name = vlc.Meta(i).name meta_value = cd_media.get_meta(i) if meta_value: print(f"{meta_name}: {meta_value}")
完整修正后的测试代码
import vlc import time # 初始化实例并开启CD-TEXT支持 instance = vlc.Instance("--no-xlib", "--cdraw-enabled", "--cdtext-enabled") player = instance.media_player_new() medialist = instance.media_list_new() listplayer = instance.media_list_player_new() listplayer.set_media_player(player) # 添加CD媒体(根据系统替换设备路径) cd_mrl = "cdda:///E:/" medialist.add_media(cd_mrl) listplayer.set_media_list(medialist) listplayer.play() time.sleep(2) # 等待播放启动 # 获取并解析CD媒体元数据 cd_media = medialist.item_at_index(0) cd_media.parse() while not cd_media.is_parsed(): time.sleep(0.1) print("=== CD元数据 ===") for i in range(vlc.Meta.NumberOfValues): meta_name = vlc.Meta(i).name meta_value = cd_media.get_meta(i) if meta_value: print(f"{meta_name}: {meta_value}") # 播放控制逻辑 listplayer.pause() print("pauza") time.sleep(5) listplayer.play() print("play") time.sleep(5) listplayer.next() print("next") time.sleep(5) listplayer.previous() print("previous") time.sleep(5) listplayer.stop() listplayer.play() print("stopplay") time.sleep(5) listplayer.stop()
额外注意事项
- 设备路径:树莓派上CD光驱的默认路径为
/dev/sr0,需确保当前用户有读写权限(可执行usermod -a -G cdrom pi添加权限) - CD兼容性:仅包含CD-TEXT信息的CD才能提取标题、艺术家等元数据,普通CD只能获取轨道号信息
- 异步等待:必须等待
is_parsed()返回True后再读取元数据,否则会得到空值
内容的提问来源于stack exchange,提问作者Trybulion
相关产品推荐
相关产品推荐

