APE,FLAC文件轉WAV文件


    近日需要實現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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM