读书频道 > 网站 > 网页设计 > 想到做到:Android开发关键技术与精彩案例
9.2.2 ID3V1标签
12-08-06    叶孤城
收藏    我要投稿   
这不是一本只讲android开发技术的图书,本书让开发者站在移动互联产业链条上思考自己该怎么做本书按照入门篇、进阶篇和游戏篇三大部分,结合37个案例系统全面地介绍Android应用和游戏开发的知识。结合实践和设计模...立即去当当网订购
MP3标准问世之后,一个亟需解决的问题就是给音频文件增加元数据描述。1996年,Eric Kemp在音频文件的尾部增加了一段数据用来解决这个问题,这段数据称做ID3V1。ID3V1是固定长度的,共128个字节,位于MP3文件的尾部。ID3V1的结构如表9-1所示。
表9-1  ID3V1结构
字    段 长    度 描    述
Header 3 内容总是“TAG”
Title 30 歌曲的标题
Artist 30 歌曲的歌手
Album 30 歌曲的专辑
Year 4 年份
Comment 28 注释
Reserve 1 保留字段
Track 1 歌曲在专辑中的位置
Genre 1 歌曲风格索引值
 
ID3V1类
ID3V1的结构比较简单,因此解析ID3V1的代码并不复杂。在initialize()方法中,创建一个RandomAccessFile对象,调用seek()方法将文件的游标定位到ID3V1开始的位置,然后按照ID3V1的结构依次读取其中的内容。ID3V1的代码如下所示:
public class ID3V1 {
 
    private String title;
    private String artist;
    private String album;
    private String comment;
    private String year;
    private byte reserve;
    private byte track;
    private byte genre;
    private File file;
//可以用MP3文件测试ID3V1解析的结果
    public static void main(String[] args) {
        File f = new File("f:/media/mp3/other/huozhe.mp3");
        ID3V1 id3v1 = new ID3V1(f);
        try {
            id3v1.initialize();
            System.out.println(id3v1.toString());
        } catch (MP3Exception e) {
            e.printStackTrace();
        }
    }
    public ID3V1(File file) {
        this.file = file;
    }
    public void initialize() throws MP3Exception {
        try {
            //可以随机访问文件的任意部分
            RandomAccessFile raf = new RandomAccessFile(file, "r");
            //跳到ID3V1开始的位置
            raf.seek(raf.length() - 128);
            byte[] tag = new byte[3];
            //读取Header
            raf.read(tag);
            if (!new String(tag).equals("TAG")) {
                throw new MP3Exception("No ID3V1 found");
            }
            byte[] tags = new byte[125];
            raf.read(tags);
            //逐一读取ID3V1中的各个字段
            readTag(tags);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void readTag(byte[] array) {
        title = new String(array, 0, 30).trim();
        artist = new String(array, 30, 30).trim();
        album = new String(array, 60, 30).trim();
        year = new String(array, 90, 4);
        comment = new String(array, 94, 28).trim();
        reserve = array[122];
        track = array[123];
        genre = array[124];
    }
    public String toString(){
        StringBuffer buffer = new StringBuffer();
        buffer.append("标题="+title+"\n");
        buffer.append("歌手="+artist+"\n");
        buffer.append("专辑="+album+"\n");
        buffer.append("年代="+year+"\n");
        buffer.append("注释="+comment+"\n");
        return buffer.toString();
    }
}
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站