在Bash脚本中批量将.cda转换为.mp3并保留原文件名
解决CD中.cda转MP3的脚本问题
首先要明确:.cda文件并不是实际的音频文件,它只是CD光盘上的轨道索引标记,每个文件只有44字节,仅记录对应轨道的位置信息,没有实际音频数据。你复制.cda到硬盘后,ffmpeg根本无法从中提取音频,这就是命令失效的核心原因。
正确的做法是直接从CD的音频轨道抓取并编码为MP3,不需要复制.cda文件。以下是修正后的脚本:
# 创建目标目录(USB驱动器路径为/d/,参数$1作为子文件夹名称) TARGET_DIR="/d/$1" mkdir -p "$TARGET_DIR" # 获取CD的总轨道数(假设CD驱动器盘符为/e/) TRACK_COUNT=$(ffprobe -v error -show_entries format=nb_streams -of default=noprint_wrappers=1:nokey=1 cdrom://e/) # 遍历每个轨道,转换为MP3 for ((track=1; track<=TRACK_COUNT; track++)); do # 从CD轨道读取音频,用libmp3lame编码,-q:a 2对应高质量MP3(0-9,数值越小质量越高) ffmpeg -i "cdrom://e/?track=$track" -codec:a libmp3lame -q:a 2 "$TARGET_DIR/track_$track.mp3" done # 查看转换完成的文件 ls "$TARGET_DIR"
关键说明:
mkdir -p "$TARGET_DIR":确保目标目录存在,即使父目录不存在也会自动创建,避免因目录不存在报错。ffprobe:用来探测CD的总轨道数,保证能遍历所有音频轨道。- 循环中的ffmpeg命令:直接从CD的指定轨道读取原始音频数据,无需依赖
.cda文件,编码为MP3时通过-q:a 2设置高质量参数,你可以根据需求调整数值(0为最高质量,9为最低)。 - 输出文件按轨道编号命名,避免文件覆盖,也方便区分不同曲目。
注意事项:
- 确保Git Shell环境中已安装ffmpeg和ffprobe,且能正常调用(可通过
ffmpeg -version和ffprobe -version验证)。 - 确认CD驱动器的盘符正确(脚本中为
e/,需替换为你实际的CD盘符)。 - 转换过程中不要弹出CD,确保光盘始终在驱动器内。
内容的提问来源于stack exchange,提问作者Yonatan Tevet-Markelevich
相关产品推荐
相关产品推荐

