CUE 文件及其格式说明
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2013/11/15/cue-file-format/
文章目录
CUE 文件,即 CUESheets ,光盘镜像辅助文件。通常用于光盘刻录、音乐播放等等。比如用 EAC 刻录CD光盘,或者用 Foobar2000 播放整轨音乐文件。
CUE 文件是非常好的音乐专辑信息载体,使用它可以使专辑信息和音乐文件分离,从而达到播放整轨 WAV、FLAC、APE 等文件的目的。
由于篇幅有限,本文只描述音乐文件播放相关的内容,因此和刻录有关的信息可能不大详细,敬请原谅。
1. CUE 基本规范
-
CUE 是使用 ANSI 编码文本 格式储存的,以 .cue 为后缀储存的文件。
-
其内容分为 Header 文件头,和 Tracks-Info 数据轨描述表两部分。其中 Header 文件头是可选的。
-
CUE 文件必须与文件内描述的数据文件位于同一目录下。(FLAC 音频文件可以内嵌 CUE 文件)
-
CUE 文件的修改与数据文件无关,因而 CUE 文件的丢失对数据文件无实质影响。
2. CUE 命令参考
2.1. 文件头
首先我们来看看 Header 文件头,其常见格式如下:(文件头是可选的,其全部内容都不是必须的)
1TITLE <cd-title>
2
3PERFORMER <performer-name>
4
5SONGWRITER <writer-name>
6
7CATALOG <catalog-id>
8
9REM DATE <date>
10
11REM DISCID <discid-id>
12
13REM GENRE <classes>
14
15REM COMMENT <comments>
16
17CDTEXTFILE <cd-text-file-name>
这里出现了如下命令:(也许你发现了,这些命令全部用大写,其实大小写没关系,但是为了格式化,所以命令再次统一用大写的)
TITLE
CATALOG
SONGWRITER
PERFORMER
REM
CDTEXTFILE
下面我们对上面的命令逐行分析,记住 头部信息全部都是可有可无的,当然有就最好不过了。
2.1.1. TITLE 命令(头部)
这条命令很明显,指定唱片标题。格式为:
1TITLE <title>
比如MJ的专辑《Thriller》:
1TITLE "Thriller"
注意:
-
<title>
必须小于80个字符。 -
对于长且有空格的名称,必须用半角双引号引起来。这里建议在任何情况下都把
<title>
用双引号引起来。 -
刻录时,如果刻录机不支持 CD-TEXT,则此命令将被忽略。但是在播放器里是有效的。
2.1.2. PERFORMER 命令(头部)
这条命令也很简单,指定唱片演唱者。格式为:
1PERFORMER <performer-name>
比如MJ的专辑《Thriller》
1PERFORMER "Michelle Jackson"
注意:
-
<performer-name>
必须小于80个字符。 -
对于长且有空格的名称,必须用半角双引号引起来。这里建议在任何情况下都把
<performer-name>
用双引号引起来。 -
刻录时,如果刻录机不支持 CD-TEXT,则此命令将被忽略。但是在播放器里是有效的。
2.1.3. SONGWRITER 命令(头部)
这条命令也很简单,指定唱片乐曲编曲者。格式为:
1SONGWRITER <writer-name>
比如冯曦妤的歌曲《幸运儿》
1SONGWRITER "冯曦妤"
注意:
-
<writer-name>
必须小于80个字符。 -
对于长且有空格的名称,必须用半角双引号引起来。这里建议在任何情况下都把
<writer-name>
用双引号引起来。 -
刻录时,如果刻录机不支持 CD-TEXT,则此命令将被忽略。但是在播放器里是有效的。
2.1.4. REM 命令(头部)
这条命令表示注释,通常用来标明一些 CUE 阅读说明。格式为:
1REM <comments>
比如
1REM 这是说明哦。
但是 REM 命令通常不会被这么使用,因为 CUE 文件格式简单,不需要写什么注释。于是 REM 就被用来指定各种 CUE 的扩展命令,这些扩展命令一般也是用于头部信息(音轨信息部分也有,后面会提到),一般作用于 Foobar2000 等音乐播放器。下面将逐个说明:
2.1.4.1. REM GENRE <class-names>
这个命令用于指定唱片、专辑的分类,建议后面的 <class-names>
用半角双引号引起来。
例如贝多芬精选集里其中一张 CD:
1REM GENRE "Classical"
2.1.4.2. REM DISCID <cd-id>
这个命令用于指定 CD 的唯一编号,建议后面的 用半角双引号引起来。
例如贝多芬精选集里其中一张 CD:
1REM DISCID "5C0D6808"
2.1.4.3. REM DATE <date>
这个命令用于指定光盘的发行时间,精确到年。其中可以用半角双引号引起来。
例如,一张 2009 年发布的 CD:
1REM DATE 2009
2.1.4.4. REM COMMENT <comment-string>
这个命令用于指定 CUE 的生成说明,建议后面的 用半角双引号引起来。
例如使用 EAC 生成的 CUE 文件一般都带如下类似信息:
1REM COMMENT "ExactAudioCopy v0.99pb4"
2.1.5. CATALOG 命令
这条命令用于指定唱片的唯一 EAN 编号。格式为:
1CATALOG <catalog-id>
比如 George Michael 的专辑 《Songs From The Last Century》。
1CATALOG "7243848740251"
这是个比较重要的玩意儿,它表示这张唱片的身份证,是一个 13 位的数字,通常和唱片的 EAN 码一致。也就是说,这张唱片的唯一编号。世界上不会有两张唱片的 CATALOG 相同的。关于这个 CATALOG 码,要了解更多请参考百度百科。
注意:
-
<catalog-id>
必须为13个字符。 -
这里建议把
<catalog-id>
用半角双引号引起来。 -
注意本命令最多只能在 CUE 文件内出现一次,可以没有。通常位于头部。
2.1.6. CDTEXTFILE 命令
这条命令用于指定光盘上使用的 CD-TEXT 信息文件的名称,具体用途不在此说明,需要的请自行查阅相关文献。格式为:
1CDTEXTFILE <cd-text-filename>
比如
1CDTEXTFILE "cd-text1.cdt"
2
3CDTEXTFILE "c:\cds\cd-text2.cdt"
注意:
-
<cd-text-filename>
可以是文件名,也可以包含文件路径。 -
如果
<cd-text-filename>
内包含空格,那么必须用半角双引号引起来。这里建议总是把<cd-text-filename>
用半角双引号引起来。 -
如果刻录机不支持 CD-TEXT,那么此命令将被忽略。
至此,头部信息文件介绍完毕。
2.2. 数据轨描述表
数据轨描述表分为两部分:
一、核心部分,即下面格式中未被[]包含的内容,这一部分是必须存在的;
二、单轨描述信息,即下面格式中被[]包含的部分。
数据轨描述表的格式如下:(注意[]不是内容,只是表示其里面的内容为可选段)
1FILE <data-file-name> <file-type>
2
3 TRACK <track-id> <track-data-type>
4
5 INDEX 01 <track-begin-time>
6
7 [TITLE <track-title>]
8
9 [PERFORMER <performer-name>]
10
11 [SONGWRITER <writer-name>]
12 [ISRC <isrc-code>]
13
14 [FLAGS <flags>]
15
16 [PREGAP <pre-mute-time>]
17 [POSTGAP <post-mute-time>]
18
19 [REM REPLAYGAIN_TRACK_GAIN +/- *.** dB]
20
21 [REM REPLAYGAIN_TRACK_PEAK *.******]
22
23 [INDEX <index> <track-begin-time>]
数据信息描述表格式如上所示,其中 FILE 命令可以有多条,而每条 FILE 命令下又可以有多条 TRACK 命令。下面介绍各条命令。
2.2.1. FILE 命令
这条命令用于声明一个数据文件。格式为:
1FILE <data-file-name> <file-type>
其中 <data-file-name>
是位于 CUE 文件 相同目录下的数据文件名称。<file-type>
为文件的数据类型:
File Type | 说明 |
---|---|
BINARY | 二进制数据文件,必须是 Little-Endian 编码格式。 |
MOTOROLA | 二进制数据文件,必须是 Big-Endian 编码格式。 |
AIFF | AIFF 音频文件 |
WAVE | WAVE 音频文件(WAV/FLAC/APE) |
MP3 | MP3 音频文件 |
不同的文件应该对应不同的文件类型。
比如:
1FILE "01 - Niki Nana (We're One).flac" WAVE
注意:
-
每个 CUE 文件内至少含有一条
FILE
命令。 -
<data-file-name>
必须用半角双引号引起来。 -
注意
<data-file-name>
必须与 CUE 文件位于相同目录下。
2.2.2. TRACK 命令
这条命令用于声明某个数据文件内的一条数据轨段。格式为:
1TRACK <track-id> <track-data-type>
其中 <track-id>
是轨段编号,取值必须在 01
到 99
之内。<track-data-type>
为轨段的数据类型,与刻录机型号有关,一般为 AUDIO,其他 <track-data-type>
类型请自行查阅相关文献。
比如:
1TRACK 01 AUDIO
注意:
-
每个
FILE
命令内至少含有一条TRACK
命令。 -
<track-id>
即为播放器内识别的音轨号。
2.2.3. INDEX 命令
这条命令对某个数据文件内的一条数据轨进行分段。格式为:
1INDEX <index> <begin-time>
其中 <index>
是子轨段编号,取值必须在 00
到 99
之内。<begin-time>
为子轨段的时间起点。对于 <index>
,其中00和01为比较特殊的点。
INDEX 00
为要跳过的轨内空白段,而 INDEX 01
为轨段的有效起点。
此处我犯了两个错误,源于此前编写本文时,我未深入了解 INDEX 的具体语法格式。
- 此处的
INDEX
后面跟的时间是采用M:S:F(Minutes/Seconds/Frames)
编码格式,而不是H:M:S(Hours/Minutes/Seconds)
编码格式。 这个格式是 CD 音轨的时间编码格式,其中Frames
是指帧数,一秒钟有75
帧。感谢网友
duyihua202449
的指正,此信息源自维基百科中对 CUE Sheet 的介绍。
- 第二个问题是,
INDEX 00
是用于跳过两个 TRACK 之间的空档(仅用于刻录机),对于播放器来说,这个 INDEX 00 会被忽略,只会使用 INDEX 01。
1TRACK 01 AUDIO
2
3 INDEX 01 00:00:00
4
5 REM 每个文件的第一个 TRACK 不能有 INDEX 00,其 INDEX 01 必须为 00:00:00。
6
7TRACK 02 AUDIO
8
9 INDEX 00 05:00:00
10
11 REM 由于 INDEX 00 仅用于刻录机,因此并不会被播放器识别,这里的 INDEX 00 会被忽略
12 REM 即 INDEX 00 在播放器中既不影响 TRACK 01 的长度,也不影响 TRACK 02 的起点。
13
14 INDEX 01 05:05:50
15
16 REM 这个 INDEX 01 才是 TRACK 02 的真正起点,也是 TRACK 01 的终点,根据两个 TRACK 的 INDEX 01 时间差来计算 TRACK 01 的时长即可。
注意:
-
每个
TRACK
命令内至少含有INDEX 01
。 -
每个文件第一个
TRACK
的INDEX 01
都应从00:00:00
开始,且不得有INDEX 00
。很多 CUE 文件无法被 Foobar2000 识别,就是因为这个错误。
2.2.4. PREGAP 命令
这条命令类似于 INDEX 00
,但又略有所不同。格式为:
1PREGAP <skip-time>
这条命令的作用和 INDEX 00
相似,但却又不相同。其中 <skip-time>
是要插入的空白时间长度。区别在于:
-
PREGAP
是在该轨段前硬性加入一段空白时间(数据全为0),常用于刻录中,Foobar2000 不支持(不能识别,会直接忽略)。 -
PREGAP
是在轨段前插入真实数据,而INDEX 00
只是跳过轨段内部的一段数据,因此两者不同。 -
PREGAP
可以用于文件的第一个TRACK
中,而INDEX 00
不可以。
比如:
1TRACK 01 AUDIO
2
3 PREGAP 00:02:00
4
5 INDEX 01 00:00:00
注意:
-
每个
TRACK
命令内最多只能有一条PREGAP
命令。 -
PREGAP
必须位于TRACK
命令后,所有INDEX
命令之前。
2.2.5. POSTGAP 命令
这条命令类似于 INDEX 00
,但又略有所不同。格式为:
1POSTGAP <skip-time>
这条命令的作用和 INDEX 00
相似,但却又不相同。其中 <skip-time>
是要插入的空白时间长度。区别在于:
-
POSTGAP
是在该轨段后硬性加入一段空白时间(数据全为0),常用于刻录中,Foobar2000 不支持。 -
POSTGAP
是在轨段后插入真实数据,而INDEX 00
只是跳过轨段内部的一段数据,因此两者不同。 -
POSTGAP
可以文件的第一个TRACK
中,而INDEX 00
不可以。
比如:
1TRACK 01 AUDIO
2
3 INDEX 01 00:00:00
4
5 POSTGAP 00:02:00
注意:
-
每个
TRACK
命令内最多只能有一条POSTGAP
命令。 -
POSTGAP
必须位于所有INDEX
命令之后。
2.2.6. TITLE、SONGWRITER、PERFORMER 命令
用于描述每条数据轨段的信息,用法参考 Header 部分。
注意:
- 在数据轨描述表内,这3条命令必须在
TRACK
命令后使用。
2.2.7. ISRC 命令
该命令指定数据轨的 ISRC 码(参考百度百科)。格式为:
1ISRC <isrc-code>
例如 NightWish 的《Imaginearum》专辑里第1轨:
1ISRC FI3SN1100001
注意:
-
该命令是单轨信息部分,必须出现在
TRACK
命令后面,且每轨只能有一条ISRC
命令。 -
<isrc-code>
可以并建议用半角双引号引起来。
2.2.8. FALGS 命令
该命令指定数据轨的 SUBCODES,用于刻录中。格式为:
1FLAGS <sub-codes>
可用 SUBCODES
如下:
Sub Code | 说明 |
---|---|
DCP | 允许数位复制。 |
PRE | 允许预加重。 |
4CH | 四声道音讯。 |
SCMS | 连续复制管理系统。 |
例如 Bandari 的《Emerald Valley》专辑里第1轨:
1FLAGS DCP
注意:
-
该命令是单轨信息部分,必须出现在
TRACK
命令后面,且每轨只能有一条FLAGS
命令。 -
FLAGS
命令一次可以指定多条 subcode。
2.2.9. REM 命令
REM 命令在头部信息中已经描述过,此处对其扩展命令的用法进行补充说明,只用于 TRACK 命令中。格式为:
2.2.9.1. REM REPLAYGAIN_TRACK_GAIN +/- *.** dB
这个命令用于指定音轨的增益回放信息,用于提高/降低音量。
例如Groove Coverage的《21st Century》第02轨:
1REM REPLAYGAIN_TRACK_GAIN -10.22 dB
2.2.9.2. REM REPLAYGAIN_TRACK_PEAK *.******
这个命令用于指定音轨的增益回放信息,指定音轨峰值。
例如Groove Coverage的《21st Century》第02轨:
1REM REPLAYGAIN_TRACK_PEAK 0.977142
3. 范例解析
3.1. 实例 1
此处
/* ... */
表示我的注释,注意/* ... */
并非CUE内容,下同。
1PERFORMER "Nightwish" /* 指定音乐光盘作者 */
2TITLE "Nemo, CDS, Normal Version" /* 指定光盘标题 */
3REM GENRE "Heavy Metal" /* 音乐分类 */
4REM DATE 2004 /* 发行年份 */
5REM DISCID 3F054305 /* 光盘 DISCID 编码 */
6REM COMMENT "ExactAudioCopy v0.99pb4" /* CUE 生成信息 */
7FILE "Nightwish - Nemo, CDS, Normal Version.ape" WAVE /* FILE 命令,指定音乐文件 */
8 TRACK 01 AUDIO /* 第一个音轨 */
9 TITLE "Nemo (From The Album 'Once')" /* 音轨标题 */
10 PERFORMER "Nightwish" /* 音乐演唱者 */
11 INDEX 01 00:00:00 /* 第一轨 INDEX 01 必须从 00:00:00 开始 */
12 TRACK 02 AUDIO /* 第二个音轨 */
13 TITLE "Planet Hell(From The Album 'Once')" /* 音轨标题 */
14 PERFORMER "Nightwish" /* 音乐演唱者 */
15 REM REPLAYGAIN_TRACK_GAIN -8.32 dB /* 音乐增益回放信息 */
16 REM REPLAYGAIN_TRACK_PEAK 0.977234 /* 音乐增益回放信息 */
17 INDEX 00 04:29:03 /* 跳过两轨间的空档 */
18 INDEX 01 04:29:04 /* 第二个音轨的起点 */
3.2. 实例 2
1TITLE "Imaginaerum"
2PERFORMER "Nightwish"
3REM GENRE "Symphonic Metal"
4REM DATE 2011
5REM DISCID BA118E0D
6REM COMMENT "ExactAudioCopy v1.0b3"
7FILE "01 - Taikatalvi.flac" WAVE /* 第一个文件 */
8 TRACK 01 AUDIO /* 只有一个 TRACK */
9 TITLE "Taikatalvi"
10 PERFORMER "Nightwish"
11 REM REPLAYGAIN_TRACK_GAIN -5.14 dB
12 REM REPLAYGAIN_TRACK_PEAK 0.977142
13 ISRC FI3SN1100001 /* 指定音轨的 ISRC 编号 */
14 INDEX 01 00:00:00 /* 每个文件第一个 TRACK 的 INDEX 01 必须从 00:00:00 开始,且不能有 INDEX 00*/
15FILE "02 - Storytime.flac" WAVE /* 第二个文件 */
16 TRACK 02 AUDIO /* 只有一个 TRACK */
17 TITLE "Storytime"
18 PERFORMER "Nightwish"
19 ISRC FI3SN1100002 /* 指定音轨的 ISRC 编号 */
20 INDEX 01 00:00:00 /* 每个文件第一个 TRACK 的 INDEX 01 必须从 00:00:00 开始,且不能有 INDEX 00*/
3.3. 实例 3
1TITLE "Example"
2PERFORMER "Unknown"
3FILE "exp1.wav" WAVE /* 第一个文件 */
4 TRACK 01 AUDIO /* 文件的第一个音轨 */
5 TITLE "Track 01"
6 INDEX 01 00:00:00
7 TRACK 02 AUDIO /* 文件的第二个音轨 */
8 TITLE "Track 02"
9 INDEX 00 00:04:49 /* 跳过其中 7s 空白*/
10 INDEX 01 00:04:56
11FILE "exp2.wav" WAVE /* 第二个文件 */
12 TRACK 03 AUDIO /* 文件的第一个音轨 */
13 TITLE "Track 03"
14 INDEX 01 00:00:00
(全文完)