Java--语言应用--批量修改MP3的文件名、标题

从网上下了些脱口秀mp3,准备回家的时候在路上听听。

下载之后发现文件名都是以“某某网整理”开头,导入到手机之后歌名长得连有用的信息都看不到了。

不想一个个改了,于是敲了几行java,来了个批量重命名,有循环就是好啊!

package file;

import java.io.File;

public class ChangeFileName {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String parentDir="E:\\<span style="font-family:Microsoft YaHei;">脱口秀</span>\\2014\\";
		File parent=new File(parentDir);
		File[] files=parent.listFiles();
		for (int i = 0; i < files.length; i++) {
			String oldName=files[i].getName();
			String newName=oldName.replace("【鸿新网www.hhxin.com整理】<span style="font-family:Microsoft YaHei;">脱口秀第</span>","");
			newName=newName.replace("<span style="font-family:Microsoft YaHei;">期</span>:", "");
			files[i].renameTo(new File(parentDir+newName));
		}
	}
}


可是再次导入到播放器之后,尼玛居然还是有“某某网整理”!

用windows资源管理器看看属性,发现原来“标题”才是显示在播放器中的歌名。


于是Google了一下怎样用代码修改这破属性,发现那些信息是写在MP3尾部(ID3v1)以及头部的(ID3v2)。

找到一个可以修改尾部信息的代码

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;


/**
 * 获得MP3文件的信息
 * 
 */
public class Test {
	
	public static void main(String[] args) {
		//TODO 演示
		File MP3FILE = new File("test.mp3");
		try {
			Test info = new Test(MP3FILE);
			info.setCharset("UTF-8");
			System.out.println(info.getSongName());
			System.out.println(info.getArtist());
			System.out.println(info.getAlbum());
			System.out.println(info.getYear());
			System.out.println(info.getComment());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
	private String charset = "utf-8";//解析MP3信息时用的字符编码
	
	private byte[] buf;//MP3的标签信息的byte数组
	
	/**
	 * 实例化一个获得MP3文件的信息的类
	 * @param mp3 MP3文件
	 * @throws IOException 读取MP3出错或则MP3文件不存在
	 */
	public Test(File mp3) throws IOException{
		
		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 IOException("MP3标签信息数据长度不合法!");
		}
		
		
	}

	/**
	 * 获得目前解析时用的字符编码
	 * @return 目前解析时用的字符编码
	 */
	public String getCharset() {
		return charset;
	}

	/**
	 * 设置解析时用的字符编码
	 * @param charset 解析时用的字符编码
	 */
	public void setCharset(String charset) {
		this.charset = charset;
	}
	
	public String getSongName(){
		try {
			return new String(buf,3,30,charset).trim();
		} catch (UnsupportedEncodingException e) {
			return new String(buf,3,30).trim();
		}
	}
	
	public String getArtist(){
		try {
			return new String(buf,33,30,charset).trim();
		} catch (UnsupportedEncodingException e) {
			return new String(buf,33,30).trim();
		}
	}
	
	public String getAlbum(){
		try {
			return new String(buf,63,30,charset).trim();
		} catch (UnsupportedEncodingException e) {
			return new String(buf,63,30).trim();
		}
	}
	
	public String getYear(){
		try {
			return new String(buf,93,4,charset).trim();
		} catch (UnsupportedEncodingException e) {
			return new String(buf,93,4).trim();
		}
	}
	
	public String getComment(){
		try {
			return new String(buf,97,28,charset).trim();
		} catch (UnsupportedEncodingException e) {
			return new String(buf,97,28).trim();
		}
	}
	
	
}


尼玛居然现在的MP3都使用了存储信息量大的ID3v2,而且信息的长度都不固定,这让我怎么找到id="TIT2"的数据帧啊!

阅读了不知多少时间的id3v2.3文档之后,我TM终于受不了了!


于是我打开资源管理器,全选音频,进入属性页,

然后愉快地把标题的值改为空,确定之后所有的标题就都被我改为空啦!




没有标题的话播放器就会把文件名当成歌名的。


就是这么简单!放着写好的接口你不去调用,真TM的无聊。。。。。。


posted @ 2014-10-01 20:04  finalize  阅读(1008)  评论(0编辑  收藏  举报