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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:07:40