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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章