mp3这种音乐格式的音乐文件在我们的生活中遇到的是最多最普通的,那么他们有那些属性了。要是你看到下面的解释没有觉得他很强大,那你就是一个强人,在网上淘的,加上自己的一些理解吧

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
/**
*
* 这个类用来获取一首音乐的详细信息
* @author pengqinping
*/
public class Mp3
{
private RandomAccessFile ran = null;
private static File file = null;
/**
* @param file(我们创建当前类的对象的时候初始化我们传过来的music对象)
* @throws FileNotFoundException
*/
public Mp3(File file) throws FileNotFoundException
{
super();
Mp3.setFile(file);
System.out.println(file.length() + "字节");
System.out.println(((double) file.length()) / (1024 * 1024));
ran = new RandomAccessFile(file, "r");
System.out.println("文件装载完毕");
}
/**
*
* 获取音乐的详细信息并且保存在map中
* @param file
* @return 返回类型说明
*/
public static Map<String, String> getMusicMsg(File file)
{
Map<String, String> map = new HashMap<String, String>();
try
{
Mp3 read = new Mp3(file);
byte[] buffer = new byte[128];
read.ran.seek(read.ran.length() - 128);
read.ran.read(buffer);
SongInfo info = new SongInfo(buffer);
System.out.println("Name:"+info.getSongName()+";artist:"+info.getArtist()+";album:"+info.getAlbum());
map.put("musicname", info.getSongName());
map.put("musicauthor", info.getArtist());
map.put("musicalbum", info.getAlbum());
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return map;
}
public static void setFile(File file)
{
Mp3.file = file;
}
public static File getFile()
{
return file;
}
public static void main(String[] args)
{
getMusicMsg(new File("../MP3/music2/Home And Dry.mp3"));
}
}
package Mp3;
public class SongInfo {
private final String TAG = "TAG"; // 文件头1-3
private String songName; // 歌曲名4-33
private String artist; // 歌手名34-63
private String album; // 专辑名61-93
private String year; // 年94-97
private String comment; // 备注98-125
private byte r1, r2, r3; // 三个保留位126,127,128
private boolean valid; // 是否合法
public transient String fileName; // 此歌曲对应的文件名,没有封装
public SongInfo(byte[] data) {
if (data.length != 128) {
throw new RuntimeException("数据长度不合法:" + data.length);
}
String tag = new String(data, 0, 3);
// 只有前三个字节是TAG才处理后面的字节
if (tag.equalsIgnoreCase("TAG")) {
System.out.println("这首歌有TAG++"+tag);
valid = true;
songName = new String(data, 3, 30).trim();
artist = new String(data, 33, 30).trim();
album = new String(data, 63, 30).trim();
year = new String(data, 93, 4).trim();
comment = new String(data, 97, 28).trim();
r1 = data[125];
r2 = data[126];
r3 = data[127];
} else {
valid = false;
}
}
public SongInfo() {
}
/**
* 返回是否合法
*
* @return 是否
*/
public boolean isValid() {
return valid;
}
/**
* 得到此对象的128个字节的表示形式
*
* @return
*/
public byte[] getBytes() {
byte[] data = new byte[128];
System.arraycopy(TAG.getBytes(), 0, data, 0, 3);
byte[] temp = songName.getBytes();
System.arraycopy(temp, 0, data, 3, temp.length > 30 ? 30 : temp.length);
temp = artist.getBytes();
System.arraycopy(temp, 0, data, 33, temp.length > 30 ? 30 : temp.length);
temp = album.getBytes();
System.arraycopy(temp, 0, data, 63, temp.length > 30 ? 30 : temp.length);
temp = year.getBytes();
System.arraycopy(temp, 0, data, 93, temp.length > 4 ? 4 : temp.length);
temp = comment.getBytes();
System.arraycopy(temp, 0, data, 97, temp.length > 28 ? 28 : temp.length);
data[125] = r1;
data[126] = r2;
data[127] = r3;
return data;
}
public String getArtist() {
return artist;
}
public void setArtist(String authorName) {
this.artist = authorName;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public byte getR1() {
return r1;
}
public void setR1(byte r1) {
this.r1 = r1;
}
public byte getR2() {
return r2;
}
public void setR2(byte r2) {
this.r2 = r2;
}
public byte getR3() {
return r3;
}
public void setR3(byte r3) {
this.r3 = r3;
}
public String getSongName() {
return songName;
}
public void setSongName(String songName) {
if (songName == null) {
throw new NullPointerException("歌名不能是null!");
}
valid = true;
this.songName = songName;
}
public String getAlbum() {
return album;
}
public void setAlbum(String specialName) {
this.album = specialName;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}

转载于:https://www.cnblogs.com/pengqinping/archive/2012/06/13/2547164.html

java深度解析mp3文件相关推荐

  1. java mp3解析_java深度解析mp3文件

    mp3这种音乐格式的音乐文件在我们的生活中遇到的是最多最普通的,那么他们有那些属性了.要是你看到下面的解释没有觉得他很强大,那你就是一个强人,在网上淘的,加上自己的一些理解吧 import java. ...

  2. java 读取mp3,java 解析MP3文件

    java 解析MP3文件 首先需要知道的是,MP3文件的文件信息都放在文件最后的128个字节里面,这128个字节分别存储的信息如下: char Header[3];    /* 标签头必须是" ...

  3. Java 实现解析xml文件的基本步骤(做笔记)

    今天,初步学习了Java实现解析xml文件的基本步骤.不多说先上图解了. 源代码: public class Dome1 { public static void main(String[] args ...

  4. Java jdom解析xml文件带冒号的属性

    Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...

  5. 【笔记】解析MP3文件信息

    在写有关音乐播放的程序的时候有时需要解析文件的一些基本信息,例如MP3格式的文件中的 艺术家,专辑,歌曲名,比特率,专辑图片等等 直接对MP3文件编码进行分析的过程比较复杂,这里介绍一个库的使用,通过 ...

  6. java处理解析xml文件的几种方法及每种方法的区别

    文章目录 了解xml xml文件的结构 **特殊处理** **CDATA** 强烈建议 处理xml文件的几种方式 认识Document对象 解析xml文档 该选择哪种方式解析 DOM解析xml文件 D ...

  7. 解析mp3文件,获得mp3中的专辑图片

    这仍然也是操作的是字节,所以其他语言都是适用的. mp3文件的首尾都存有文件的信息,存在尾部的称为ID3V1,在首部的称为 ID3V2.专辑图片是存放在部的ID3V2.所以这里解析ID3v2 主要的知 ...

  8. java dat 解析_dat文件如何用java解析?

    用javamail解析邮件(失败 xiao__jia__jia3492018-11-03 如何用java输出Excel文件 wnk123456562012-07-19 Java发送邮件Excel附件名 ...

  9. Java当中解析ini文件对应到JavaBean当中

    目录 1.ini文件简介 2.ini文件 3.ini解析工具类 4.示例运行结果 1.ini文件简介 .ini 文件是Initialization File的缩写,即初始化文件,是windows的系统 ...

最新文章

  1. poj 2337 Catenyms 【欧拉路径】
  2. Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)
  3. [Java并发编程实战] 共享对象之可见性
  4. Coil - Google推荐的协程图片加载库
  5. mysql 协议的query包及解析
  6. UNIX(多线程):18---异步任务提供者(Provider) 介绍(续)
  7. hdoj-1046-Gridland(规律题)
  8. 企业入职测试题目及答案_[企业入职性格测试题以与答案信息]新员工入职性格测试题...
  9. 马尔可夫链 ▏小白都能看懂的马尔可夫链详解
  10. OKR 与绩效考核结合的推进行业案例:医药行业
  11. 计算机美食网页毕业论文,毕业论文--美食网页计与制作.doc
  12. HTML文档属于哪种数据结构,三种常见的数据结构
  13. mysql insert嵌套select_mysql之UPDATE,SELECT,INSERT语法
  14. Photon网络游戏开发——PUN2简介
  15. linux yum ku,Linux基础知识:Linux yum 配置与使用
  16. 建模学习—带你轻松认识并掌握3Dmax
  17. 骨传导耳机对耳朵好不好、不伤耳的骨传导耳机推荐
  18. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法...
  19. 穷爸爸和富爸爸读后感
  20. JAVA 十六进制转十进制正负数

热门文章

  1. lamda获取参数集合去空_lambda表达式对集合的遍历
  2. 秀米复制到公众号格式变了_公众号文章下载神器!支持批量、多格式,可下载历史全部文章...
  3. Android Studio + TensorFlow lite 0.1.7
  4. 使用OGR2OGR将S57数据转为shp格式
  5. 开源GIS(四)——openlayers中geoserver发布的WMS与WFS加载
  6. java中常见的数据结构分类
  7. Modelbuilder进阶教程
  8. VirtualBox启动失败,The VM session was aborted.
  9. C#对象序列化与反序列化
  10. 【java学习之路】(java SE篇)(练习)关于常用类的心血来潮小练习