.版本 2
.支持库 iconv
.子程序 取ID3v2标签, ID3v2, 公开, 支持ID3v2.3
.局部变量 p标签, 整数型
.局部变量 标签, 文本型
.局部变量 标签头, 字节集, , , 10
.局部变量 标签尺寸, 整数型
.局部变量 帧尺寸, 整数型
.局部变量 帧标识, 文本型
.局部变量 帧内容, 字节集
.局部变量 标签帧组, 字节集, , , 除去标签头
.局部变量 x, 整数型
.局部变量 x1
.局部变量 ID3v2, ID3v2
.局部变量 计次
p标签 = BASS_ChannelGetTags (实例句柄, #BASS_TAG_ID3)
.如果真 (BASS_ErrorGetCode () = #BASS_ERROR_NOTAVAIL)
p标签 = BASS_ChannelGetTags (实例句柄, #BASS_TAG_ID3V2)
.如果真结束
' ID3V2.3标签结构
' 一个标签头 + 多个标签帧
' 标签头[10]: 类型[3](必须是"ID3") 版本号[1] 副版本号[1] 标志[1](二进制只有3位) 标签大小[4](每个字节最高位为0,不使用 包括标签头和标签帧)
标签头 = 指针到字节集 (p标签, 10)
' 调试输出 (“标签信息”, 字符 (标签头 [1]) + 字符 (标签头 [2]) + 字符 (标签头 [3]), 字符 (标签头 [4]), 字符 (标签头 [5]), 字符 (标签头 [6]))
' 调试输出 (“标签尺寸”, 到整数 (标签头 [7]) × 2097152 + 到整数 (标签头 [8]) × 16384 + 到整数 (标签头 [9]) × 128 + 到整数 (标签头 [10]))
标签尺寸 = 到整数 (标签头 [7]) × 2097152 + 到整数 (标签头 [8]) × 16384 + 到整数 (标签头 [9]) × 128 + 到整数 (标签头 [10])
标签帧组 = 指针到字节集 (p标签, 标签尺寸)
标签帧组 = 取字节集右边 (标签帧组, 标签尺寸 - 10)
' 标签帧:帧头【10】 内容【不定】
' 帧头:标识【4】 内容尺寸:【4】(不包括帧头,最小为1) 标志【2】
' 举例:
' * “帧标识” | “TSSE”(编码设置) | “帧尺寸” | 13
' * “帧标识” | “APIC”(封面) | “帧尺寸” | 94331
' * “帧标识” | “COMM”(备注) | “帧尺寸” | 950
' * “帧标识” | “TALB”(专辑) | “帧尺寸” | 37
' * “帧标识” | “TIT1”(内容分组) | “帧尺寸” |
' * “帧标识” | “TIT2”(标题) | “帧尺寸” | 37
' * “帧标识” | “TIT3”(副标题) | “帧尺寸” |
' * “帧标识” | “TPE1”(作者) | “帧尺寸” | 59
' * “帧标识” | “TPE2”(乐队) | “帧尺寸” |
' * “帧标识” | “TPE3”(指挥) | “帧尺寸” |
' * “帧标识” | “TPE4”(Remix) | “帧尺寸” |
' * “帧标识” | “TRCK”(音轨) | “帧尺寸” | 5
' * “帧标识” | “TYER”(年代) | “帧尺寸” |
x = 1
.循环判断首 ()
帧标识 = 字符 (标签帧组 [x]) + 字符 (标签帧组 [x + 1]) + 字符 (标签帧组 [x + 2]) + 字符 (标签帧组 [x + 3])
帧尺寸 = 到整数 (标签帧组 [x + 4]) × 16777216 + 到整数 (标签帧组 [x + 5]) × 65536 + 到整数 (标签帧组 [x + 6]) × 256 + 到整数 (标签帧组 [x + 7])
.如果真 (帧标识 ≠ “”)
帧内容 = 取字节集中间 (标签帧组, x + 10, 帧尺寸)
.判断开始 (帧标识 = “TIT2”)
' 帧内容 [1] = 0 表示ISO-8859-1编码 = 1 表示Unicode编码
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.标题 = ID3v2.标题 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.标题 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.判断 (帧标识 = “TPE1”)
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.作者 = ID3v2.作者 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.作者 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.判断 (帧标识 = “TALB”)
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.专辑 = ID3v2.专辑 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.专辑 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.判断 (帧标识 = “APIC”) ' 音乐封面
' 封面数据结构: 编码格式【1】 MIME类型【不定】 图片类型【1】 数据描述段【不定】 真实图片数据【剩余长度】
.判断开始 (到整数 (帧内容 [1]) = 0)
x1 = 2
取字节集数据 (帧内容, #文本型, x1) ' MIME类型 C++中用strlen计算长度
取字节集数据 (帧内容, #文本型, x1)
.判断 (到整数 (帧内容 [1]) = 1) ' Unicode编码
' 未完成
.默认
.判断结束
ID3v2.封面 = 取字节集右边 (帧内容, 帧尺寸 - x1 + 1)
.判断 (帧标识 = “TYER”)
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.年代 = ID3v2.年代 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.年代 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.判断 (帧标识 = “TRCK”)
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.音轨 = ID3v2.音轨 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.音轨 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.判断 (帧标识 = “COMM”)
.判断开始 (帧内容 [1] = 0)
.计次循环首 (帧尺寸 - 3, 计次)
ID3v2.备注 = ID3v2.备注 + 字符 (帧内容 [计次 + 3])
.计次循环尾 ()
.判断 (帧内容 [1] = 1)
ID3v2.备注 = 到文本 (编码转换 (取字节集右边 (帧内容, 帧尺寸 - 1), #编码_UTF_16, #编码_GB2312, ))
.默认
.判断结束
.默认
.判断结束
.如果真结束
' 位置跳到下一帧
x = x + 10 + 帧尺寸
.循环判断尾 (x + 10 ≤ 标签尺寸 - 10)
返回 (ID3v2)