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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:15:13