Merge branch 'master' of git://github.com/plusjade/jekyll-bootstrap
[GalaxyBlog.git] / _posts / 2013-10-06-Archlinux-ape-cue-splitting.md
blobd51f08960e062515b4e07aa0223f84a039b38dcd
1 ---
2 layout: post
3 title: "Archlinux下有关无损音乐的折腾"
4 date: 2013-10-06 23:29
5 comments: true
6 tags: [Linux, music, ZT]
7 ---
9 最近发现一些旧番的音乐只有无损的了...MP3的已经无法满足大众的需求了么....  
10 但是在Linux下直接用MPD播放无损音乐不能分轨播放实在是不能接受.
11 于是就开始找寻切割的方法...Archwiki有相关的条目[APE+CUE Splitting](https://wiki.archlinux.org/index.php/APE%2BCUE_Splitting)
12 但是,有个明显的缺陷是分轨之后的文件居然不是用歌曲名字命名的!
13 而且还是我不怎么喜欢的wav格式...
14 不过我还是在菊苣的帮助下找到了完美的解决方案~
16 #无损音乐的分轨
17 Linux下有个shntool的工具非常实用,可以完美解决无损音乐分轨的问题.
18 根本不需要wiki里面说的cuebreakpoints  
19 `shntool split -f example.cue -t %n_%p_%t  -o  'cust  ext=mp3  lame  --quiet  - %f' example.ape`  
20 -t指的是文件的标题,%n 代表编号,%p 表示 Performer,%t 表示 Title.都是从cue里面读取的信息,shntool默认不支持
21 mp3格式的,所以需要指定用lame编码器进行编码.当然很多人只是想分轨,并不想转换成压缩的mp3格式.  
22 `shntool split -f example.cue -t %n_%p_%t  -o  flac example.ape`  
23 直接转换成flac格式就好了,因为flac格式是开源的无损音乐格式,播放器对它支持的肯定比较好.
25 #给每个音乐文件打TAG
26 转换之后的文件只是单纯的音乐文件,每个音乐并没有包含想关的TAG信息,这时候需要用cuetag.sh给每个音乐文件打TAG  
27 [cuetag.sh脚本](https://gist.github.com/acgotaku/7279681) 最新版貌似有问题不能使用.  
28 `cuetag.sh file.cue *.mp3`  
29 命令很简单,在转换好的音乐文件夹下指定cue文件和mp3文件即可自动打TAG,但是需要注意的一点是,这个脚本打的是ID3v1的标签,如果是非英语语言的话,
30 会出现乱码问题.详情请戳[Mp3标签乱码问题分析与解决方案](http://linux-wiki.cn/wiki/Mp3%E6%A0%87%E7%AD%BE%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88)
31 所以,之后我们还是要使用[mp3tagiconv](https://code.google.com/p/mp3tagiconv/)
32 这个工具来进行标签的转换使得所有的播放器都能够正确识别mp3音乐的标签.  
33 `for i in *.mp3; do echo "y"| mp3tagiconv "${i}" ;done`  
34 因为mp3tagiconv这个工具每次更新标签都会提示yes or no ,所以我就修改了下执行方式,使得批量自动化修改.flac格式的音乐不存在TAG编码问题.
36 #flac转换为mp3
37 虽然在PC上听无损比较爽,但是放在手机上受制于存储空间和CPU性能,还是转换成Mp3比较好.  
38 `flac -d -c example.flac | lame -q 0 -b 320 - example.mp3`  
39 如果想保留flac的回放增益特性的话可以在转换的时候加上  
40 `--apply-replaygain-which-is-not-lossless` 参数.
42 到此,折腾完毕...
44 #cuetag.sh脚本存档
45 {% highlight bash %}
46 #! /bin/sh
48 # cuetag.sh - tag files based on cue/toc file information
49 # uses cueprint output
50 # usage: cuetag.sh <cuefile|tocfile> [file]...
51 # dependencies:
52 # id3v2
53 CUEPRINT=cueprint
54 cue_file=""
56 usage()
58         echo "usage: cuetag.sh <cuefile|tocfile> [file]..."
61 # Vorbis Comments
62 # for FLAC and Ogg Vorbis files
63 vorbis()
65         # FLAC tagging
66         # --remove-all-tags overwrites existing comments
67         METAFLAC="metaflac --remove-all-tags --import-tags-from=-"
69         # Ogg Vorbis tagging
70         # -w overwrites existing comments
71         # -a appends to existing comments
72         VORBISCOMMENT="vorbiscomment -w -c -"
74         case "$2" in
75         *.[Ff][Ll][Aa][Cc])
76                 VORBISTAG=$METAFLAC
77                 ;;
78         *.[Oo][Gg][Gg])
79                 VORBISTAG=$VORBISCOMMENT
80                 ;;
81         esac
83         # space seperated list of recomended stardard field names
84         # see http://www.xiph.org/ogg/vorbis/doc/v-comment.html
85         # TRACKTOTAL is not in the Xiph recomendation, but is in common use
86         
87         fields='TITLE VERSION ALBUM TRACKNUMBER TRACKTOTAL ARTIST PERFORMER COPYRIGHT LICENSE ORGANIZATION DESCRIPTION GENRE DATE LOCATION CONTACT ISRC'
89         # fields' corresponding cueprint conversion characters
90         # seperate alternates with a space
92         TITLE='%t'
93         VERSION=''
94         ALBUM='%T'
95         TRACKNUMBER='%n'
96         TRACKTOTAL='%N'
97         ARTIST='%c %p'
98         PERFORMER='%p'
99         COPYRIGHT=''
100         LICENSE=''
101         ORGANIZATION=''
102         DESCRIPTION='%m'
103         GENRE='%g'
104         DATE=''
105         LOCATION=''
106         CONTACT=''
107         ISRC='%i %u'
109         (for field in $fields; do
110                 value=""
111                 for conv in `eval echo \\$$field`; do
112                         value=`$CUEPRINT -n $1 -t "$conv\n" "$cue_file"`
114                         if [ -n "$value" ]; then
115                                 echo "$field=$value"
116                                 break
117                         fi
118                 done
119         done) | $VORBISTAG "$2"
122 id3()
124         MP3INFO=mid3v2
126         # space seperated list of ID3 v1.1 tags
127         # see http://id3lib.sourceforge.net/id3/idev1.html
129         fields="TITLE ALBUM ARTIST YEAR COMMENT GENRE TRACKNUMBER"
131         # fields' corresponding cueprint conversion characters
132         # seperate alternates with a space
134         TITLE='%t'
135         ALBUM='%T'
136         ARTIST='%p'
137         YEAR=''
138         COMMENT='%c'
139         GENRE='%g'
140         TRACKNUMBER='%n'
142         for field in $fields; do
143                 value=""
144                 for conv in `eval echo \\$$field`; do
145                         value=`$CUEPRINT -n $1 -t "$conv\n" "$cue_file"`
147                         if [ -n "$value" ]; then
148                                 break
149                         fi
150                 done
152                 if [ -n "$value" ]; then
153                         case $field in
154                         TITLE)
155                                 $MP3INFO -t "$value" "$2"
156                                 ;;
157                         ALBUM)
158                                 $MP3INFO -A "$value" "$2"
159                                 ;;
160                         ARTIST)
161                                 $MP3INFO -a "$value" "$2"
162                                 ;;
163                         YEAR)
164                                 $MP3INFO -y "$value" "$2"
165                                 ;;
166                         COMMENT)
167                                 $MP3INFO -c "$value" "$2"
168                                 ;;
169                         GENRE)
170                                 $MP3INFO -g "$value" "$2"
171                                 ;;
172                         TRACKNUMBER)
173                                 $MP3INFO -T "$value" "$2"
174                                 ;;
175                         esac
176                 fi
177         done
178         $MP3INFO -s "$2"
181 main()
183         if [ $# -lt 1 ]; then
184                 usage
185                 exit
186         fi
188         cue_file=$1
189         shift
191         ntrack=`cueprint -d '%N' "$cue_file"`
192         trackno=1
194         if [ $# -ne $ntrack ]; then
195                 echo "warning: number of files does not match number of tracks"
196         fi
198         for file in "$@"; do
199                 case $file in
200                 *.[Ff][Ll][Aa][Cc])
201                         vorbis $trackno "$file"
202                         ;;
203                 *.[Oo][Gg][Gg])
204                         vorbis $trackno "$file"
205                         ;;
206                 *.[Mm][Pp]3)
207                         id3 $trackno "$file"
208                         ;;
209                 *)
210                         echo "$file: uknown file type"
211                         ;;
212                 esac
213                 trackno=$(($trackno + 1))
214         done
217 main "$@"
218 {% endhighlight %}