使用pycdio读取CD-DA时遇未知编码,无法提取可用音频字节
解决pycdio读取CD-DA返回字符串无法转为可用字节的问题
一、修复当前pycdio的字节提取问题
pycdio在Python 3环境下读取CD-DA扇区时,会将原始二进制数据错误解码为Unicode字符串。由于CD-DA是无编码的16位大端双声道PCM数据,可通过latin-1编码将字符串还原为原始字节——该编码是单字节映射,能完整保留所有0x00-0xFF的字节值,不会丢失数据。
修改后的关键代码片段:
import os, io, cdio, pycdio from pydub import AudioSegment # 初始化CD驱动器 cd = cdio.Device(driver_id=pycdio.DRIVER_LINUX) cd.open() track_num = 1 if cd.get_track(track_num).get_format() == 'audio': lsn_start = cd.get_track(track_num).get_lsn() read_mode = pycdio.READ_MODE_AUDIO # 读取扇区(示例读取55个,可根据需求调整) blocks, data = cd.read_sectors(lsn_start, read_mode, 55) # 将错误解码的字符串还原为原始字节 audio_bytes = data.encode('latin-1') # 包装为BytesIO供pydub处理 audio_io = io.BytesIO(audio_bytes) # 按CD-DA标准格式加载为AudioSegment audio_segment = AudioSegment.from_raw( audio_io, sample_width=2, # 16位采样 frame_rate=44100, # 44.1kHz采样率 channels=2, # 双声道 endianness='big' # 大端字节序 ) # 后续可直接对audio_segment进行处理
二、替代库建议
如果pycdio的兼容性问题难以解决,推荐以下更适配Python 3的库:
- cdio-python:pycdio的官方维护升级版本,修复了Python 3下的字节处理问题,读取CD-DA直接返回bytes类型,API与pycdio基本兼容。
- pyscdlib:专注于CD-ROM操作的轻量库,支持直接读取完整CD-DA轨道为原始二进制数据,对Python 3的支持更完善,无需额外处理编码问题。
- libdiscid + 自定义读取逻辑:结合libdiscid识别CD信息,再通过ctypes调用libcdio的C API封装读取逻辑,灵活性更高。
内容的提问来源于stack exchange,提问作者Enginma
相关产品推荐
相关产品推荐

