在GNU/Linux下将CD音乐转为mp3
以前我欣赏古典音乐都是听的CD,因而珍藏了不少光盘以及下载到电脑上的ape与flac格式的音乐文件。随着手机硬件性能(如电池续航能力、处理器速度、音质、存储容量等)和软件功能(音乐播放器对于曲目的管理)的提升,便需要考虑如何将这些资源转换成高质量的mp3文件放到手机上聆听。本文介绍如何基于GNU/Linux下的Audacity、k3b、easytag软件,以及自己写的Bash脚本程序来实现此功能。
从光盘抓取音乐并转为mp3
k3b是KDE环境下默认的光盘刻录与抓取软件。其界面如下图所示。
选择菜单Tools中的Rip Audio CD,我们可用它直接从CD光盘上抓取出wav文件。接下来,打开Audacity音乐编辑软件,将抓取的多个wav文件导入(而非打开)为多个音轨。再选择菜单Files中的Export Multiple,将导出格式选为mp3,导出选项中的采样频率设为320 kbps,然后点击导出即可完成转换。如下图所示。
最后,打开easytag软件,填写mp3文件的曲目信息(ID3 Tag)。注意,点击信息文本框旁边的小圆点,可以一次性地将设置应用到所有选中的文件。如下图所示。
将ape或flac文件转为mp3文件
一般下载的CD Rip文件是ape或flac格式的,具有无损音质。可若直接将其拷到手机上,一是某些软件可能不支持这两种格式,二是它们所占用的存储空间太大了,三是由于它们也不包含类似于mp3文件的ID3 tag信息,从而无法被音乐播放软件自动根据专辑名或作曲家名而自动分类管理。因此,有必要将ape和flac文件按曲目拆分并转换为mp3格式,填写曲目信息后再导入手机。
可以看出,这里首先需要解决的是ape与flac文件的曲目拆分问题。一般来说,与它们一同下载的还会有个扩展名为cue的文件。此文件保存了CD的曲目信息,包括音乐风格(GENRE)、制作年份(DATE)、表演者(PERFORMER)、专辑/CD名称(TITLE)、ape或flac文件的名称(FILE),以及每个音轨(TRACK)的标题(TITLE)、表演者(PERFORMER)和开始时间(INDEX 01)。如下所示:
REM GENRE Classical
REM DATE 1991
REM DISCID 9B0E701C
REM COMMENT "ExactAudioCopy v0.95b4"
PERFORMER "Wächter, Sutherland, Schwarzkopf, Taddei, Alva, Sciutti, Frick"
TITLE "Don Giovanni - Giulini 1/3"
FILE "CDImage.ape" WAVE
TRACK 01 AUDIO
TITLE "Sinfonia"
PERFORMER "Wächter, Sutherland, Schwarzkopf, Taddei, Alva, Sciutti, Frick"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "Notte e giorno faticar"
PERFORMER "Wächter, Sutherland, Schwarzkopf, Taddei, Alva, Sciutti, Frick"
INDEX 01 06:18:07
TRACK 03 AUDIO
TITLE "Non sperar, se non m'uccidi"
PERFORMER "Wächter, Sutherland, Schwarzkopf, Taddei, Alva, Sciutti, Frick"
INDEX 01 07:58:31
需要说明的是,某个音轨的信息中可能同时含有INDEX 00与INDEX 01,那么该曲目实际的开始时间是由INDEX 01来指定的。INDEX 01的值比INDEX 00要大一些,目的是为了跳过该曲目前端的空白部分。由INDEX 01指定的时间分为三部分:分钟:秒:1/75秒。
在搞清楚cue文件的格式后,我们再来看音乐编辑软件Audacity所拥有的一个功能:我们可以通过导入包含各音轨信息的标签(label)文件,再选择Export Multiple,则可以将整个的ape或flac文件作拆分并转换为mp3文件。该标签文件的格式如下:
0.000000 0.000000 Sinfonia
378.093333 378.093333 Notte e giorno faticar
478.413333 478.413333 Non sperar, se non m'uccidi
其中,每一行代表一个曲目。每一行中的第一列与第二列的内容相同,都是该音轨的开始时间,单位是秒。第三列则是该曲目的标题。
从cue到label文件的转换可以在这里在线完成,但毕竟不太方便。所以,我写了一个脚本程序cue2lbl.sh,来实现同样的功能。源代码如下:
#!/bin/bashscript_name="cue2lbl.sh" script_usage=$(cat <<EOF $script_name [OPTIONS] cue_file EOF ) script_function=$(cat <<EOF Convert a cue CD index file to Audacity label file. EOF ) script_doc=$(cat <<EOF Script documentation. -h Display this help. -o Specify output lable file. EOF ) script_examples=$(cat <<EOF $script_name -o music.txt music.cue EOF ) state_prefix="===" warning_prefix="***" error_prefix="!!!"function display_help() {if [ -n "$script_usage" ]; thenecho -e "Usage: $script_usage"fiif [ -n "$script_function" ]; thenecho -e "$script_function"fiif [ -n "$script_doc" ] ; thenecho -e "\n$script_doc"fiif [ -n "$script_examples" ]; thenecho -e "\nExamples"echo -e "$script_examples"fi }# Output label file lbl_file=""# Process command options while getopts ":ho:" opt; docase $opt inh ) display_helpexit 0 ;;o ) lbl_file=$OPTARG ;;\? ) display_helpexit 1 ;;esac done shift $(($OPTIND - 1))# Start execute the command if [ -z "$lbl_file" ]; thenlbl_file="${1%cue}txt" fi# Label file first time writing lbl_file_1st_write=1# Searched state: 0 for start; 1 for track; 2 for title; 3 for index. searched_state=0declare -i track_time_minute=0 track_time_second=0IFS=$'\n' for line in `grep -i "\(INDEX\)\|\(TITLE\)\|\(TRACK\)" "$1"`; docase $searched_state in0 )if [ -n "`echo "$line" | grep -i TRACK`" ]; thensearched_state=1fi ;;1 )if [ -n "`echo "$line" | grep -i "TITLE"`" ]; then# Remove blanks at the beginning and end of a lineline=`echo "$line" | gawk -f /usr/local/bin/scripts/rmblank.awk`# Get titletrack_title=`echo "$line" | gawk -f /usr/local/bin/scripts/cue2lbl_get_title.awk`track_title=`echo "$track_title" | gawk -f /usr/local/bin/scripts/rmblank.awk | tr -d \"`searched_state=2fi ;;2 )if [ -n "`echo "$line" | grep -i "INDEX"`" ]; then# Remove blanks at the beginning and end of a lineline=`echo "$line" | gawk -f /usr/local/bin/scripts/rmblank.awk`# Get track indexline=`echo "$line" | gawk -f /usr/local/bin/scripts/cue2lbl_get_index.awk`track_index=`echo "$line" | gawk -f /usr/local/bin/scripts/rmblank.awk | cut -f 1 -d " " | tr -d " "`if [ "$track_index" = "01" ] || [ "$track_index" = "1" ]; then# Get track timetrack_time=`echo "$line" | gawk -f /usr/local/bin/scripts/rmblank.awk | cut -f 2 -d " " | tr -d " "`track_time_minute=`echo "$track_time" | cut -f 1 -d ":" | gawk '{if (match($0, "^0+$") != 0) {print "0";} else {gsub("^0+", ""); print}}'`track_time_second=`echo "$track_time" | cut -f 2 -d ":" | gawk '{if (match($0, "^0+$") != 0) {print "0";} else {gsub("^0+", ""); print}}'`track_time_sub_second=`echo "$track_time" | cut -f 3 -d ":" | gawk '{if (match($0, "^0+$") != 0) {print "0";} else {gsub("^0+", ""); print}}'`track_time_total_seconds=$(($track_time_minute * 60 + $track_time_second))track_time_sub_second=`echo "scale=6; $track_time_sub_second / 75" | bc`if [ "$track_time_sub_second" = "0" ]; thentrack_time_sub_second=".000000"fitrack_time_total_seconds=`echo "$track_time_total_seconds$track_time_sub_second"`fifiif [ -n "`echo "$line" | grep -i "TRACK"`" ]; then# Print collected track informationif [ "$lbl_file_1st_write" = "1" ]; thenecho -e "$track_time_total_seconds\t$track_time_total_seconds\t$track_title" > "$lbl_file"lbl_file_1st_write=0elseecho -e "$track_time_total_seconds\t$track_time_total_seconds\t$track_title" >> "$lbl_file"fisearched_state=1fi ;;esac done# Print the last collected track information if [ "$lbl_file_1st_write" = "1" ]; thenecho -e "$track_time_total_seconds\t$track_time_total_seconds\t$track_title" > "$lbl_file" elseecho -e "$track_time_total_seconds\t$track_time_total_seconds\t$track_title" >> "$lbl_file" fi
为了完成字符串的匹配,该脚本程序中用到了几个gawk程序,分别如下:
1. 移除行首与行尾的空白字符:
{gsub("(^[[:blank:]]+)|([[:blank:]]+$)", "");print; }
2. 删除INDEX:
/^(INDEX)|(index)/ {print gensub("^(INDEX)|(index)[[:blank:]]+", "", 1);}
3. 删除TITLE:
/^(TITLE)|(title)/ {print gensub("^(TITLE)|(title)[[:blank:]]+", "", 1);}
至此,有了label文件,便可用Audacity将ape和flac转换生成多个mp3文件了。
将mp3文件导入手机
目前我的手机上使用的是“酷我音乐”播放器,可以直接通过Wifi由电脑向手机传歌。如下图所示,打开“酷我音乐”后,点击页面底部的“电脑-手机传歌”:
然后在电脑上打开浏览器,输入提示的地址,添加文件即可。
转载于:https://www.cnblogs.com/quantumman/p/4678168.html
在GNU/Linux下将CD音乐转为mp3相关推荐
- Linux下基于Libmad库的MP3音乐播放器编写
linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...
- linux 系统下开源软件 ngspice 仿真实例,调侃Spice历史和GNU/Linux下做Spice电路仿真...
更应该注意一个细节问题:BSD在开发SPICE那时,就已经Open Source么? 经过小小的考证(所以,我说这个文章是"调侃"),原来大家非常熟悉的BSD License最早可 ...
- 【评论】GNU/Linux下有多少是GNU的?
导读:一个葡萄牙的学生写了一篇文章 <How much GNU is there in GNU/Linux?>由酷壳网的陈皓整理编译为<GNU/Linux下有多少是GNU的>. ...
- GNU/Linux下有多少是GNU的?
导读:一个葡萄牙的学生写了一篇文章 <How much GNU is there in GNU/Linux?>由酷壳网的陈皓整理编译为<GNU/Linux下有多少是GNU的>. ...
- Linux下将普通文本转为可执行文件
2019独角兽企业重金招聘Python工程师标准>>> Linux下将普通文本转为可执行文件 chmod +x auto.sh 转载于:https://my.oschina.net/ ...
- linux下网易云音乐无法连接网络问题的解决思路
linux下网易云音乐无法连接网络问题的解决思路 1.当所有需要联网的音乐播放器都出现网络无法连接或者google chrome 出现代理问题,可以检查下你最近是否弄了代理. 例如: 我最近就弄了个代 ...
- GNU/Linux下如何设计PCB印刷电路板
GNU/Linux下如何设计PCB印刷电路板 gplEDA This website contains links to Electronic Design Automation(EDA) tools ...
- linux下使用libmad库实现mp3文件的解码、播放
linux下使用libmad库实现mp3文件的解码.播放 目录(?)[+] 准备工作 解码流程 播放 遇到的问题 据说这个更新到2004年2月的libmad是一种高品质的MPEG音频解码器,支持24- ...
- 完全在GNU/Linux下工作
Hi! 我们来看看很关键的一种计算机软件叫做"操作系统"(名词解释略 :P).GNU/Linux 是一个操作系统,如果你不知道它是怎样一个系统,可以参考 http://www.ke ...
- linux ace platform_linux.gnu,Linux下配置和使用ACE笔记
1. 下载 ACE 5.7. 从 http://download.dre.vanderbilt.edu/ 下载 ACE+TAO+CIAO-5.7.tar.gz包. 2. 解压 将压缩包copy到l ...
最新文章
- 的python如何降级_提效降本:蚂蚁金服如何用融合计算改造在线机器学习
- ArcGIS Desktop 10.5 安装教程(win10环境下)
- 基于IdentityServer的系统对接微信公众号
- Android之 如何解决ScrollView 和ListView滑动冲突的问题如何解决ScrollView can host only one direct child
- python__实参前加*和**的(拆包)功能
- Windows环境下配置thrift编译器(VS2015)
- 【报告分享】2021-2022年中国人工智能创投数据报告.pdf(附下载链接)
- js中函数参数值传递和引用传递
- 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
- 计算机基础一体化教程(习题)
- 计算机页面排版的笔记,爱记笔记却懒得排版?这款笔记 App 为你准备了最实用的经典模板:格子笔记...
- java gui 测试工具_开发者眼中最好的22款GUI测试工具(上)
- paper report: DIRT-T
- qduoj 分辣条1 (搜索+剪枝)
- 2021-04-20 m_map的几个地形水深数据库安装步骤
- 8个微信实用技巧,你知道多少?
- 超强的波多黎各,值得尊敬的美国队
- 判断并求出两个圆的交点(平面几何)
- Java SE 网络编程
- java中如何导出excel_java中如何导出excel表格
热门文章
- abaqus中六面体单元对比四面体
- matlab 四面体,《有限元基础教程》【MATLAB算例】481基于4节点四面体单元的空间块体分析(Tetrahedron3D4Node)...
- EXCEL 合并同样格式的多个excel文件
- 树的最小表示法 UVA 12489 - Combating cancer
- eliteadmin网页后台管理模板简介
- cubieboard2 android,在cubieboard2双卡版上从零构建Android4.2.2系统
- Diskpart 实现分区自动化
- python中reduce什么意思_python中的reduce
- 三维建模学习太难?业内前辈给你指点一下!
- Redis:只刷面试题,怎可能进大厂,多理解原理(RDB 持久化、AOF持久化)