计算机系菜鸟一个..  初次开独立博客,请多多指教!


原来在这篇文章里提到了IPC跳歌的原因是IPC对320Kbps、LAME3.98编码的文件支持不好:
http://blog.oubeichen.com/201110/ipodclassicipctiaogejiejue/

但是由于一直很懒,结果导致了IPC里堆积大量有问题的歌曲,隔几首歌就要跳一首,不能忍。
而不仅是itunes,各种同步ipod歌曲的软件都不支持用编码方式来排序,所以不能很容易找出LAME3.98编码的文件。
于是只好自己用mediainfo找了…

想法是这样的,从IPC的歌曲文件夹下找到每一首mp3歌曲,使用mediainfo进行检测。
从输出的结果判断是否为320Kbps、LAME3.98编码。
如果是则拷贝到一个新的文件夹里,就可以方便地自己转码然后同步回去了。

至于是否可以直接删掉文件..这个我不敢试…

还是乖乖从itunes找出同名歌曲删除吧..

Windows下JAVA简单实现如下:

package oubeichen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.nio.channels.FileChannel;

public class Main {

	private static final String mediainfobase = "C:\\m\\MediaInfo.exe ";//命令行版本MediaInfo.exe路径,最后面有空格
	private static final String ipodmusicbase = "S:\\iPod_Control\\Music\\";
	//ipod classic音乐路径,一般更换盘符即可
	private static final String musiccopytarget = "C:\\newmusic\\";//拷贝音乐的目标路径
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File outer = new File(ipodmusicbase);
		String dirlist[] = outer.list();
		//ipc里的音乐文件夹 X:\iPod_Control\Music\ 里有很多目录,每个目录下都有一定数量的歌曲,如果要批量拷贝其他地方的音乐那就自己修改代码吧。
		for (int i = 0; i < dirlist.length; i++) {
			File dir = new File(ipodmusicbase + dirlist[i] + "\\");
			String filelist[] = dir.list();
			for (int j = 0; j < filelist.length; j++) {
				String filename = filelist[j];
				if (filename.endsWith(".mp3")) {
					String fullname = ipodmusicbase + dirlist[i]
							+ "\\" + filename;
					try {
						//判断文件是否有问题
						Boolean iscopy = isdeadmusic(fullname);
						if (iscopy) {
							System.out.println(fullname);
							String newfilename = musiccopytarget + filename;
							//拷贝文件
							fileChannelCopy(new File(fullname), new File(newfilename));
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

	/**
	 * 判断一个文件是否为ipod classic 支持不好的文件
	 * @param filepath 文件的完整路径
	 * @return 是否为有问题的文件
	 * @throws Exception
	 */
	public static Boolean isdeadmusic(String filepath) throws Exception {
		Process process;
		process = Runtime.getRuntime().exec(mediainfobase + filepath,
				null, null);
		InputStreamReader ir = new InputStreamReader(process.getInputStream());
		LineNumberReader input = new LineNumberReader(ir);
		String line;

		Boolean is320 = false, islame398 = false;
		while ((line = input.readLine()) != null) {
			//是否为320Kbps
			if (line.startsWith("Bit rate") && line.contains("320 Kbps"))
				is320 = true;
			//是否为lame3.98 的mp3,貌似只有3.98r有问题,所以其余的不管
			if (line.startsWith("Writing library") && line.contains("LAME3.98") &&
					!line.contains("LAME3.98a") && !line.contains("LAME3.98.2") &&
					!line.contains("LAME3.98.4")){
				islame398 = true;
			}
		}
		if (is320 && islame398)
			return true;
		return false;
	}

	/**
	 * 拷贝一个文件到另一个位置,如果已存在则直接返回
	 * @param s 拷贝的源文件
	 * @param t 拷贝的目标文件
	 */
	public static void fileChannelCopy(File s, File t) {
		if(t.exists()){
			System.out.println("File " + t.getName() + " exists!");
			return;
		}
		FileInputStream fi = null;
		FileOutputStream fo = null;
		FileChannel in = null;
		FileChannel out = null;
		try {
			fi = new FileInputStream(s);
			fo = new FileOutputStream(t);
			in = fi.getChannel();// 得到对应的文件通道
			out = fo.getChannel();// 得到对应的文件通道
			in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fi.close();
				in.close();
				fo.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}