Java--语言应用--批量修改MP3的文件名、标题
2023-02-17 00:00:00
java
从网上下了些脱口秀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的无聊。。。。。。
原文作者:finalize
原文地址: https://blog.csdn.net/u012421735/article/details/39720181
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/u012421735/article/details/39720181
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章