如何用Python判断存储卷是否为音频CD-ROM?
在Python中识别音频CD-ROM并访问内容
核心判断思路
要在无播放器依赖的情况下识别音频CD-ROM,可通过两种途径:
- 遍历
/dev目录下的块设备,通过系统硬件属性判断是否为CD-ROM驱动器 - 遍历系统已挂载的存储卷,通过文件系统类型和目录特征识别音频CD
方法一:识别/dev下的CD-ROM设备
Linux系统中CD-ROM设备通常以sr开头(如sr0、sr1),或通过/dev/cdrom软链接指向实际设备。可通过读取sysfs中的设备类型确认:SCSI设备类型5对应CD-ROM。
import os def find_cdrom_devices(): cdrom_devices = [] # 遍历/dev下的sr开头设备 for dev in os.listdir('/dev'): if dev.startswith('sr'): dev_path = f'/dev/{dev}' # 读取sysfs中的设备类型 type_path = f'/sys/class/block/{dev}/device/type' if os.path.exists(type_path): with open(type_path, 'r') as f: if f.read().strip() == '5': cdrom_devices.append(dev_path) # 检查通用软链接/dev/cdrom if os.path.exists('/dev/cdrom'): cdrom_devices.append('/dev/cdrom') # 去重后返回 return list(set(cdrom_devices))
方法二:识别已挂载的音频CD
通过/proc/mounts读取系统挂载信息,筛选文件系统类型为iso9660或udf的卷,再通过目录内的音轨文件特征确认是否为音频CD。
def find_mounted_cdroms(): mounted_cdroms = [] with open('/proc/mounts', 'r') as f: for line in f: parts = line.strip().split() dev_path, mount_point, fs_type = parts[0], parts[1], parts[2] if fs_type in ['iso9660', 'udf']: # 音频CD挂载后通常包含track开头的音轨文件 track_sample = os.path.join(mount_point, 'track01.cdda') if os.path.exists(track_sample) or len(os.listdir(mount_point)) > 0: mounted_cdroms.append((dev_path, mount_point)) return mounted_cdroms
访问音频CD内容
音频CD挂载后,每个音轨会以文件形式存在(如track01.cdda),可直接读取原始CDDA格式数据(16位大端、44100Hz立体声):
def read_cd_track(track_path): with open(track_path, 'rb') as f: return f.read()
额外操作:挂载未挂载的CD-ROM
若CD-ROM未挂载,可通过mount命令手动挂载(需root权限):
import subprocess import os def mount_cdrom(dev_path, mount_point='/media/cdrom'): if not os.path.isdir(mount_point): os.makedirs(mount_point) # 执行挂载命令,需确保当前用户有sudo权限且无需密码(或手动输入) subprocess.run(['sudo', 'mount', dev_path, mount_point], check=True)
注意事项
- 访问
/dev设备或执行挂载操作需足够权限,可将用户加入cdrom组避免频繁使用sudo - 不同Linux发行版的设备命名或挂载规则可能略有差异,需根据实际环境调整判断逻辑
- macOS系统的CD-ROM设备命名为
/dev/disk*,需修改设备筛选规则
内容的提问来源于stack exchange,提问作者Chrisp
相关产品推荐
相关产品推荐

