为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 易语言相关 > 易语言模块源码 正文

BASS库模块,支持读取ID3v2.3源码(半成品)

三叶资源网 2019-05-28 23:09:43 易语言模块源码 1683 ℃ 0 评论
.版本 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)

@hxznhf

文件下载

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
微信多开为什么go不适合做web易CEF3浏览器支持库取启动时间火山视窗软件APP加密火山安卓TCP通信未闻花名皮肤模块多文件更新变量数据交换解析选择夹图片组原子锁自动回复捆绑程序趣约会算法树型框应用社会网络字节集搜索汇编RdRand
最新评论