您的位置:首页 > 其它

APE,FLAC文件转WAV文件

2012-12-11 21:36 447 查看
    近日需要实现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">


[code]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>


 


<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>

[/code]

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

//---------------------------------------------------------------------------


[code]//处理


//入口: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);


}

[/code]

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

REM Convert Windows WAVE to MP3 (CBR 320kb/s)


[code]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

[/code]

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

APE转换WAV的批处理脚本:

REM Convert APE to Windows WAVE


[code]REM Called by APE+CUE Knife, Chen Qingcan


REM %1 APE file name


REM %2 Windows WAVE file name


 


MAC %1 %2 –d


 

[/code]

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: