还记得之前写一款Android播放软件时,为了让APP获得MP3音乐文件的相关信息,上网找了很多Java库.搞的APP满身赘肉.后来我研究了一下MP3文件的结构后发现,获取MP3文件信息根本不需要什么复杂的代码或者什么高深的Java库.完全是几行代码就可以搞定的事情.

1.MP3文件结构的简单介绍

一个规则的MP3文件大致含有3个部分:TAG_V2(ID3V2)

Frame

TAG_V1(ID3V1)

其中TAG_V2和TAG_V1这两个部分MP3文件标签信息(歌手,歌曲名,发行时间..)保存的区域

在这两个部分中,TAG_V2的长度不是固定的,包含了众多关于MP3文件的信息

而TAG_V1的长度是固定的,128byte.期中包含MP3文件的基本信息.

本片经验获取的MP3文件的信息就是从TAG_V1中获取的.

2.TAG_V1中包含了什么信息

TAG_V1部分是MP3文件的最后128byte的内容.期中包括的信息有:

标签头"TAG"    3字节

标题            30字节

作者            30字节

专辑            30字节

出品年份        4字节

备注信息        28字节

保留            1字节

音轨            1字节

类型            1字节

3.基本实现思路

1.以随机读写方式打开一个MP3文件

2.将文件指针偏移量移动到文件长度倒数128位

3.判断标签头"TAG"是否存在

3.读取TAG_V1中的各个内容

4.关闭文件

4.读入一个MP3文件的TAG_V1部分信息

byte buf = new byte[128];//初始化标签信息的byte数组

RandomAccessFile raf = new RandomAccessFile(mp3, "r");//随机读写方式打开MP3文件

raf.seek(raf.length() - 128);//移动到文件MP3末尾

raf.read(buf);//读取标签信息

raf.close();//关闭文件

if(buf.length != 128){//数据长度是否合法

throw new Exception("MP3标签信息数据长度不合法!");

}

if(!"TAG".equalsIgnoreCase(new String(buf,0,3))){//标签头是否存在

throw new Exception("MP3标签信息数据格式不正确!");

}

5.获得TAG_V1中的各个内容

String SongName = new String(buf,3,30,"utf-8").trim();//歌曲名称

String Artist = new String(buf,33,30,"utf-8").trim();//歌手名字

String Album = new String(buf,63,30,"utf-8").trim();//专辑名称

String Year = new String(buf,93,4,"utf-8").trim();//出品年份

String Comment = new String(buf,97,28,"utf-8").trim();//备注信息

6.完整代码

这是一个获取MP3文件信息的类的完整代码:(源码可在我的百度网盘下载http://pan.baidu.com/s/1kTFlLx9)

7.注意事项

我在网上看到过类似获取MP3信息的代码,在那些代码的评论中,常见到有人说获取不到MP3信息,或者获取到的信息是一堆乱码.出现这种情况的95%都是在将TAG_V1中的字节信息转换成字符串时没有指定字符编码(一般用"utf-8")而出现的;

8.拓展

如果你还想获取关于MP3文件的更多信息,可以通过解析TAG_V2中的字节来获取.(由于本人的知识面有限,没有对TAG_V2有过多的研究).大家可以在网络上学习关于TAG_V2的结构,然后解析TAG_V2中的内容.

The End

@航行刘 2014/05/11

java获取音乐_Java读取MP3文件的信息(歌曲名,歌手...)相关推荐

  1. C语言读取mp3文件的信息

    MP3文件的ID3V1信息与ID3V2信息结构的分析 --吴俊涛2005/05/05 E-mail:bo_tao@126.com QQ:29248671 主 页:http://wjt276.home4 ...

  2. java中读取mp3文件_java读取mp3文件

    JMF实际上是Java的一个类包.JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能.这些功能包括:媒体捕获.压缩.流转.回放,以及对各种主要媒体形式和编码的支 持,如M-J ...

  3. java classpath 遍历_Java 读取JAR文件信息

    Java 读取JAR文件信息 为什么想到读取JAR文件的信息 查看spring 资源处理,查找多个资源classpath*,会去寻找jar包中的内容,因此会出现读取jar包中的文件或者读取文件夹中的文 ...

  4. java wav 波形_java读取wav文件(波形文件)并绘制波形图的方法

    本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法.分享给大家供大家参考.具体如下: 因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将 ...

  5. java xml 反射_Java 读取XML文件以及Java 的反射机制实现

    Java 读取XML文件以及Java 的反射机制实现 代码部分 import java.io.File; import javax.xml.parsers.DocumentBuilder; impor ...

  6. java mp3 头信息_java读取mp3文件头信息

    标签: 最近在做一个项目的实训,有关于音乐播放的,需要取到一些音乐信息,比如播放时长,演唱歌手,歌曲名称等等信息添加到数据库中.而MP3文件本身就是带有这些信息的 而后在了解到mp3文件有2种标签 , ...

  7. 获取MP3歌曲信息 歌曲名 歌手名 专辑等

    /// <summary>/// 定义结构,存放mp3信息/// </summary>public struct Mp3Info{public string identify; ...

  8. java 获取当前目录_java获得当前文件路径

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  9. java read出错_java读取txt文件时,错误的把txt内容读取了两遍

    package标准化模拟考试;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;importjav ...

最新文章

  1. 深入浅出Rust Future - Part 1
  2. winstore独立安装包下载_QT使用教程(二)之下载篇
  3. C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别
  4. ios下划线变量:为什么变量前要加下划线才有用?
  5. 如何将nodejs项目程序部署到阿里云服务器上
  6. IOS_改变UITextField placeHolder颜色、字体
  7. MSComm写串口通信驱动步骤
  8. 如何将Windows下的文件传到Linux中
  9. sublime安装markdown
  10. java开发的微信公众号文章爬虫
  11. 第八章 磁盘存储器的管理
  12. VC操作excel(创建表格 查找 插入数据)
  13. oracle数据库怎么分组查询,oracle数据库之分组查询
  14. windows CMD批处理中的一些特殊连接符号
  15. JAVA滁州市住房公积金管理中心网站计算机毕业设计Mybatis+系统+数据库+调试部署
  16. Win7安装VS2015报错“安装包丢失或损坏”的解决方法
  17. 做自媒体视频剪辑为什么赚不到钱?
  18. 三言|一种新技术一旦开始流行,你要么坐上压路机,要么成为铺路石
  19. 2018.9.1-2021.10.25工作总结和人生规划
  20. 常见的浏览器有什么区别

热门文章

  1. logging buffer
  2. Python3 selenium获取起点收藏榜单Top100并解析字体加密
  3. 与 python 中的 os.system(cmd) 返回值与linux 命令返回值对应关系
  4. 十二钗——凡人女修们的歪诗
  5. C++ 洛谷练习题 · 神奇的幻方
  6. JAVA下载 PDF 到本地 或 返回文件流
  7. 疫苗事件中的程序员爸爸 | 整理5.8万条信息 自制小程序查疫苗质量
  8. 用友指定的服务器不可用,解决用友:不能建立跟应用服务器(xxx机器名)所指向的数据库服务器连接...
  9. 无纺布带行业调研报告 - 市场现状分析与发展前景预测
  10. Python教你秒懂:啥是佩奇?