zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Ubuntu 杂音 alsa*
    安装YouCompleteMe
    vimrc
    Linux Windows 修改键盘映射
    VMware Workstation+Linux+Xshell+Xftp+MySQL+SQLyog 配置
    leetcode Merge Intervals
    leetcode Remove Duplicates from Sorted Array II
    用栈实现二叉树的非递归中序遍历
    nth_element 测试程序
    Windows 程序设计
  • 原文地址:https://www.cnblogs.com/wintersun/p/2813708.html
Copyright © 2011-2022 走看看