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的无聊。。。。。。