近日需要实现APE(Monkey's Audio)转换WAV文件,都是目前比较流行音乐格式。如果对APE感兴趣可以下载Monkey's Audio 4.11 SDK (with source code). 回想起几年前使用一个开源小工具APE+CUE小刀,对于今天的APE依然可用。它是用一些bat脚本与HTAs实现的,最终于命令行调用MAC.EXELAME.EXE,完成APE与MP3转换。我们也可以学习一下。用编辑器打开APE+CUE.hta文件,可以看到以下代码:

<div id="she_ding" style="visibility:visible;position:absolute;left:0;top:0">
APE、CUE所在文件夹:<br/>
(一、选择该文件夹中任意一个文件)<br/>
(二、须保证APE、CUE文件名相同)<br/>
<input name="ape_cue" type="file"/><br/>
<br/>
分割后转换格式为:<br/>
<select name="ge_shi">
<option value="MP3-VBR" selected="1">MP3(浮动位速率)</option>
<option value="MP3-CBR320">MP3(固定位速率320kb/s)</option>
<option value="WMA-VBR">WMA(浮动位速率)</option>
<option value="WMA-LOSTLESS">WMA(无损压缩)</option>
<option value="APE">APE(无损压缩)</option>
<option value="WAV">WAV(无压缩)</option>
</select>
<br/><br/>
<table width="100%"><tr><td width="62%"></td><td>
<button onclick="kai_shi();">开始</button>
&nbsp;
<button onclick="shuo_ming();">说明</button>
</td></tr></table>
</div>
 
<!-- 进度 -->
<div id="jin_du" style="visibility:hidden;position:absolute;left:0;top:0">
<p id="zhuan_ji">专辑</p>
<hr/>
<ul id="dan_qu"><li>单曲</li></ul>
</div>

  
    这的确是HTML标签,还有一些脚本,这里只是部分:

//---------------------------------------------------------------------------
//处理
//入口:APE、CUE文件名(不含后缀)
function chu_li(ming)
{
    var ape = ming + ".ape";
    var cue = ming + ".cue";
    ri_zhi.WriteLine("****************************************");
    ri_zhi.WriteLine(ape.slice(ape.lastIndexOf("\\") + 1) +
        " + " +
        cue.slice(cue.lastIndexOf("\\") + 1));
    ri_zhi.WriteLine();
    
    //分析CUE文件得碟资料
    ri_zhi.WriteLine("分析CUE:");
    var a = du_qie_cue(cue);    //读入并切分
    var die = fen_xi_cue(a);    //分析
    cue_ri_zhi(die);        //分析结果写到日志
    cue_jie_mian(die);        //分析结果写到界面
    ri_zhi.WriteLine("完成。"); ri_zhi.WriteLine();
    
    //APE转WAV
    ri_zhi.WriteLine("将APE解压成Windows WAVE:");
    document.getElementById("gui0").style.color = "blue";
    var wav = huan_hou_zhui(ape, ".wav");
    a = '+ape+cue\\APE-WAVE "' + ape + '" "' + wav + '"';
    ri_zhi.WriteLine(a);
    xi_tong_ke.Run(a, 7, true);
    if (! ci_pan.FileExists(wav))
        throw Error("将APE解压成Windows WAVE时出错。");
    document.getElementById("gui0").style.color = "black";
    ri_zhi.WriteLine("完成。"); ri_zhi.WriteLine();
    
    //逐轨处理
    var wav00 = wav + "00.wav";
    for (var i = 0 ; i < die.gui.length ; i++)
    {
        ri_zhi.WriteLine(shu_zi(die.gui[i].hao) + "." + die.gui[i].ming);
        a = document.getElementById("gui" + die.gui[i].hao);
        a.style.color = "blue";
        a.scrollIntoView(false);
        
        //按CUE分割
        ri_zhi.WriteLine("割出该轨:");
        a = '+ape+cue\\WAVE-N-1 "' + wav + '" ' +
            die.gui[i].qi + ' ' +
            die.gui[i].zhi + ' "' +
            wav00 + '"';
        ri_zhi.WriteLine(a);
        xi_tong_ke.Run(a, 7, true);
        a = ci_pan.GetFile(wav00);
        if (a.Size == 0)
            a.Delete();
        if (ci_pan.FileExists(wav00))
            ri_zhi.WriteLine("完成。");
        else
        {
            ri_zhi.WriteLine("出错,跳过该轨。");
            continue;
        }
        
        //转格式
        ri_zhi.Write("转换格式到");    //该句后半部分由下列函数写
        var zhuan_hou_ming;        //转后名
        switch (ge_shi.value)
        {
        case "MP3-VBR": zhuan_hou_ming = wav_mp3(wav00, die, die.gui[i], "VBR"); break;
        case "MP3-CBR320": zhuan_hou_ming = wav_mp3(wav00, die, die.gui[i], "CBR320"); break;
        case "WMA-VBR": zhuan_hou_ming = wav_wma(wav00, die, die.gui[i], "VBR"); break;
        case "WMA-LOSTLESS": zhuan_hou_ming = wav_wma(wav00, die, die.gui[i], "LOSTLESS"); break;
        case "APE": zhuan_hou_ming = wav_ape(wav00, die, die.gui[i]); break;
        case "WAV": zhuan_hou_ming = wav_wav(wav00, die, die.gui[i]); break;
        default: throw Error("未选定转换后格式。");
        }
        ci_pan.DeleteFile(wav00);
        if (ci_pan.FileExists(zhuan_hou_ming))
            ri_zhi.WriteLine("完成。");
        else
        {
            ri_zhi.WriteLine("出错,跳过该轨。");
            continue;
        }
 
        //移到专辑目录
        ri_zhi.Write("将转换格式后之文件移至专辑目录");
        var zhuan_ji_mu_lu = wav.slice(0, wav.lastIndexOf("\\") + 1) +
            zheng_ming(die.zhuan_ji) + "\\";
        ri_zhi.WriteLine(zhuan_ji_mu_lu + ":");
        if (! ci_pan.FolderExists(zhuan_ji_mu_lu))
        {
            ri_zhi.WriteLine("专辑目录未存在,建立之。");
            ci_pan.CreateFolder(zhuan_ji_mu_lu);
        }
        var gui_dang_ming = zhuan_ji_mu_lu +    //归档名
            zhuan_hou_ming.slice(zhuan_hou_ming.lastIndexOf("\\") + 1);
        ri_zhi.WriteLine(gui_dang_ming);
        if (ci_pan.FileExists(gui_dang_ming))
        {
            ri_zhi.WriteLine("专辑目录中已有同名文件,删去。");
            ci_pan.DeleteFile(gui_dang_ming, true);
        }
        ci_pan.MoveFile(zhuan_hou_ming, gui_dang_ming);
        ri_zhi.WriteLine("完成。");
 
        document.getElementById("gui" + die.gui[i].hao).style.color = "black";
        ri_zhi.WriteLine();
    }
    
    ci_pan.DeleteFile(wav);
}

例如WAV转换320k MP3的批处理是这样的:

REM Convert Windows WAVE to MP3 (CBR 320kb/s)
REM %1 Title
REM %2 Author
REM %3 Album
REM %4 Track number
REM %5 Windows WAVE file name
REM %6 MP3 file name
 
LAME.EXE --preset insane --tt %1 --ta %2 --tl %3 --tn %4 --add-id3v2 --space-id3v1 --pad-id3v2 %5 %6


APE转换WAV的批处理脚本:

REM Convert APE to Windows WAVE
REM Called by APE+CUE Knife, Chen Qingcan
REM %1 APE file name
REM %2 Windows WAVE file name
 
MAC %1 %2 –d
 

REM是BAT文件中的注释。如果您不了解BAT批使用文件可以看这里

对于FLAC格式文件可以使用Frontah来转换。FLAC同样是一个开源无损音频编码,有兴趣可以查询它的源码。其中包含一个小工具Tag.exe,用于编辑IDE3v1,IDE3v2标记,从文件名生成Tag等功能,社区里有一些免费的前端UI

 
对于带用CUE文件的APE或WAV,可以使用CUE Splitter,这是个免费软件,还有在线手册。你可以找到绿色版。在MP3,WAV,APE,FLAC,WMA这些文件之间转换,有条件可以考虑使用商业软WAV MP3 Converter。 我们的目标是转为WAV格式是为了使用Nero刻录为CD,在Nero中选择刻录音乐CD, 把转换好的WAV文件拖入刻录文件窗口,刻录即可。 这里只是抛砖引玉。

 

希望对您开发有帮助。有兴趣可以实现自己的前端程序。


作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog

posted on 2012-12-11 21:36  PetterLiu  阅读(4817)  评论(0编辑  收藏  举报