最近在做一个音乐播放器(WinAPI+BASS),查遍了各大网站也没找到个标准的方法来读出专辑封面,最后找到了ID3标签的官方文档(https://id3.org),现在写篇文章记录下。
ID3v2(简单介绍)
标签头:
‘ID3’ 3字节
版本号 1字节
副版本号 1字节
标志 1字节
标签大小 4字节
帧头:
帧标识 4字节
帧内容大小 4字节
标志 2字节
具体说明找别的文章看吧,这不是本文重点
APIC帧(APIC=Attached picture,即附加图片)
帧内容与图片之间还间隔有一小段数据,有的文章对此介绍的很模糊,有的干脆直接认为它有特定的字节数,但实际上并不是,由下面的三张图可看出



这一小段的格式如下:
<帧头>(帧标识为APIC)
文本编码 $xx
MIME 类型 <文本字符串>$00(如'image/bmp')
图片类型 $xx
描述 $00 (00)
<图片数据>
文本编码表示描述字符串使用的编码方式,定义如下:
$00 ISO-8859-1,即Latin-1(拉丁语-1),兼容ASCII,GB2312也兼容Latin-1
$01 UTF-16LE,Windows使用的方案
$02 UTF-16BE
$03 UTF-8
MIME类型字符串为ASCII码,以NULL结尾
图片类型定义如下:
$00 其他
$01 32x32 像素“文件图标”(仅PNG)
$02 其他文件图标
$03 封面(正面)
$04 封面(背面)
$05 宣传单页
$06 媒体(例如 CD 的标签面)
$07 首席艺术家/首席表演者/独奏者
$08 艺术家/表演者
$09 指挥者
$0A 乐队/管弦乐队
$0B 作曲家
$0C 作词/文本作者
$0D 录制地点
$0E 录音期间
$0F 演出期间
$10 电影/视频截图
$11 一条颜色鲜艳的鱼(我是照字面翻译的,谁能告诉我这是个什么鬼)
$12 插图
$13 乐队/艺术家标识
$14 出版商/工作室标识
描述字符串以NULL结尾(\0个数由文本编码决定)
我的代码(很烂)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ......... else if (memcmp(pUnitHeader->ID, "APIC", 4) == 0)//图片 { BYTE* pImageData = (BYTE*)pUnitHeader + sizeof(ID3v2_UnitHeader);//指向帧内容 BYTE byEncodeingType = *pImageData;//读文本编码 int cbSize, cbImageSize = dwUnitSize;//dwUintSize为帧内容大小 pImageData++; cbImageSize--;//跳过文本编码 cbSize = lstrlenA((LPCSTR)pImageData); pImageData += cbSize; cbImageSize -= cbSize;//跳过MIME类型字符串 pImageData += 2; cbImageSize -= 2;//跳过MIME结尾NULL和图片类型 if (byEncodeingType == 0 || byEncodeingType == 3)//ISO-8859-1或UTF-8 cbSize = lstrlenA((LPCSTR)pImageData) + 1; else//UTF-16LE或UTF-16BE cbSize = lstrlenW((LPCWSTR)pImageData) * sizeof(WCHAR) + 2; pImageData += cbSize; cbImageSize -= cbSize;//跳过描述字符串和结尾NULL //现在pImageData指向图片数据,cbImageSize为图片数据长度,GDI+载它! ......... } ......... |
效果(顺便宣传宣传我的软件)

(赶紧加群687741706或者751187033来下载吧,给您磕头了??)
发表回复