近日需要实现APE(Monkey's Audio)转换WAV文件,都是目前比较流行音乐格式。如果对APE感兴趣可以下载Monkey's Audio 4.11 SDK (with source code). 回想起几年前使用一个开源小工具APE+CUE小刀,对于今天的APE依然可用。它是用一些bat脚本与HTAs实现的,最终于命令行调用MAC.EXE与LAME.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>
<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。