读取某一目录下(包括子目录)所有mp3、wma、m4a格式文件,制作成m3u列表(Java, Windows)

时间:2021-11-25 14:29:41

【标题里之所以特意说明Windows,是因为文件路径中的分隔符,在linux下是'/',而在windows下是'\';我比较懒,直接在程序里写死了,所以有需要的可以自己改啦;另外的话,支持的文件格式种类也可以自己加,很容易~】


把以前别人写过的“读取某一目录下所有文件名”的程序改了改,用来随机播放音乐——自己的Music文件夹下有很多按歌手来分类的子文件夹,一直很想把这些歌混到一起shuffle播放。


一开始想做成Windows Media Player特有的wpl文件;用文本编辑器打开看了看,其实.wpl也就是个XML文件,然后我依葫芦画瓢,也照写了一个,下面是值得注意的几个点:

1. dos文件和unix文件有区别,具体看这里http://blog.chinaunix.net/uid-22548820-id-2942782.html;

保险起见,我用vim的set fileformat=dos命令将文件改成了dos格式。

但最后事实证明,unix格式的文件WMP也能播放。


2. wpl文件中,有的歌曲名后会跟有tid="xxxxxxx"这样子的东西,我把它们删掉以后不构成影响,所以也不用去管它。


3.我也担心过文件编码问题,但其实编码也不构成大影响——唯一的影响就是,在WMP的列表窗口中,如果是ANSI编码的wpl文件,中文歌的歌名会是乱码;但如果用记事本保存成UTF-8就正常了。

参考资料1:

http://zz563143188.iteye.com/blog/1851893

参考资料2

http://www.imkevinyang.com/2009/02/%E5%AD%97%E7%AC%A6%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E6%95%85%E4%BA%8B%EF%BC%88ascii%EF%BC%8Cansi%EF%BC%8Cunicode%EF%BC%8Cutf-8%E5%8C%BA%E5%88%AB%EF%BC%89.html


4.wpl中,有一行指定了列表中item的数量——其实这个根本没用,我本以为我失败的原因是在于它。


5.最后就是——wpl文件没有被WMP成功识别;原因我也没能找到。事实上,如果一个文件夹下没有子文件夹,则程序生成的wpl文件能被WMP识别;但一有子文件夹,就不行了。没想通。

实在没辙,突然想到了m3u格式,这个简单得多,一下子就成功了,所以结论是:还是通用的音乐列表格式靠谱╮(╯▽╰)╭


<span style="font-family:SimSun;font-size:14px;">import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class MP3 {
    private static int count = 0;
    
    public static void main(String[] args) throws IOException {
        long a = System.currentTimeMillis();
        numOfSongs("D:\\Music");
        M3Uhead();
        refreshFileList("D:\\Music");
        System.out.println("Time elapsed: " + (System.currentTimeMillis() - a) + " ms");
    }
    
    public static void M3Uhead() throws IOException {
    	FileOutputStream fos = new FileOutputStream("D:\\list.m3u", true);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write("#EXTM3U");
        bw.newLine();
        bw.close();
    }
    
    public static void WPLhead() throws IOException {
    	FileOutputStream fos = new FileOutputStream("D:\\Music\\list.wpl", true);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write("<?wpl version=\"1.0\"?>\n<smil>\n    <head>\n");
        bw.write("        <meta name=\"Generator\" content=\"Microsoft Windows Media Player -- 12.0.7601.18150\"/>\n");
        bw.write("        <meta name=\"ItemCount\" content=\"" + count + "\"/>\n        <title>list</title>\n");
        bw.write("    </head>\n    <body>\n        <seq>\n");
        bw.close();
    }
    
    public static void WPLtail() throws IOException {
    	FileOutputStream fos = new FileOutputStream("D:\\Music\\list.wpl", true);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
    	bw.write("        </seq>\n    </body>\n</smil>");
    	bw.close();
    }
    
    public static void numOfSongs(String strPath) throws IOException { 
        File dir = new File(strPath); 
        File[] files = dir.listFiles(); 
        
        if (files == null) 
            return;
        for (int i = 0; i < files.length; i++) { 
            if (files[i].isDirectory()) {
            	numOfSongs(files[i].getAbsolutePath()); 
            } else {
            	String strFileName = files[i].getAbsolutePath();
            	if(strFileName.endsWith("mp3") || strFileName.endsWith("wma")) {
            		count++;
            	}          
            } 
        }
    }
    
    public static void refreshFileList(String strPath) throws IOException { 
        File dir = new File(strPath); 
        File[] files = dir.listFiles(); 
        
        FileOutputStream fos = new FileOutputStream("D:\\list.m3u", true);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        
        if (files == null) {
            bw.close();
            return;
        }
        for (int i = 0; i < files.length; i++) { 
            if (files[i].isDirectory()) {
            	//bw.write(files[i].getAbsolutePath());
                //bw.newLine();
            	refreshFileList(files[i].getAbsolutePath()); 
            } else { 
                //String strFileName = files[i].getAbsolutePath().toLowerCase();
            	String strFileName = files[i].getAbsolutePath();
            	String fileName = "#EXTINF:0," + files[i].getName();
                //System.out.println("---"+strFileName);
            	if(strFileName.endsWith("mp3") || strFileName.endsWith("wma") || strFileName.endsWith("m4a")) {
            		//strFileName  = "            <media src=\"" + strFileName + "\"/>";
            		bw.write(fileName);
            		bw.newLine();
            		bw.write(strFileName);
                	bw.newLine();
                	bw.newLine();
            	}
                //filelist.add(files[i].getAbsolutePath());                    
            } 
        }
        bw.close();
    }
}</span>