• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            使用libmpg123轉換MP3到WAVE

                在完全不知道MP3格式和libmpg123如何使用的情況下,竟然轉換出了可以“聽清楚”的Wave文件,驚喜啊~~
                通過foobar2000轉換和播放驗證,未發現錯誤,奇跡啊~~代碼如下,完成的練習代碼,表找錯了,能工作就好啊~~

              1 
              2 #include <iostream>
              3 #include <fstream>
              4 
              5 #include "mpg123.h"
              6 
              7 struct WAVE_HEADER
              8 {
              9     char    riff_sig[4];            // 'RIFF'
             10     long    waveform_chunk_size;    // 8
             11     char    wave_sig[4];            // 'WAVE'
             12     char    format_sig[4];          // 'fmt ' (notice space after)
             13     long    format_chunk_size;      // 16;
             14     short   format_tag;             // WAVE_FORMAT_PCM
             15     short   channels;               // # of channels
             16     long    sample_rate;            // sampling rate
             17     long    bytes_per_sec;          // bytes per second
             18     short   block_align;            // sample block alignment
             19     short   bits_per_sample;        // bits per second
             20     char    data_sig[4];            // 'data'
             21     long    data_size;              // size of waveform data
             22 };
             23 
             24 void InitWaveHeader(WAVE_HEADER& header, int channels, int sample, int size)
             25 {
             26     memset(&header, 0sizeof(header));
             27     memcpy(&header.riff_sig, "RIFF"4);
             28     header.waveform_chunk_size = 8;
             29     memcpy(&header.wave_sig, "WAVE"4);
             30     memcpy(&header.format_sig, "fmt "4);
             31     header.format_chunk_size = 16;
             32     header.format_tag = 1;
             33     header.channels = channels;
             34     header.sample_rate = sample;
             35     header.bytes_per_sec = sample * channels * (16 / 8);
             36     header.block_align = 2 * channels;
             37     header.bits_per_sample = 16;
             38     memcpy(&header.data_sig, "data"4);
             39     header.data_size = size;    
             40 }
             41 
             42 std::ofstream ofs;
             43 
             44 int OpenWaveFile()
             45 {
             46     ofs.open(".\\test.wav", std::ios::out | std::ios::binary);
             47     return ofs.is_open() ? 0 : -1;
             48 }
             49 
             50 int UpdateWaveHeader(const WAVE_HEADER& header, bool create)
             51 {
             52     if(!create)
             53         ofs.seekp(0, std::ios::beg);
             54     ofs.write((char*)&header, sizeof(header));
             55     return ofs.good() ? 0 : -1;
             56 }
             57 
             58 int AppendWaveData(const char* data, size_t size)
             59 {
             60     ofs.write(data, size);
             61     return ofs.good() ? 0 : -1;
             62 }
             63 
             64 void CloseWaveFile()
             65 {
             66     ofs.close();
             67 }
             68 
             69 int main()
             70 {
             71     int ret = -1;
             72 
             73     OpenWaveFile();
             74 
             75     while(true)
             76     {
             77         ret = mpg123_init();
             78         if(ret != MPG123_OK)
             79             break;
             80 
             81         char ** ch = mpg123_decoders();        
             82 
             83         mpg123_pars* mp = mpg123_new_pars(&ret);
             84         if(mp == NULL || ret != MPG123_OK)
             85             break;
             86         mpg123_delete_pars(mp);
             87         mpg123_handle *= mpg123_new("auto"&ret);
             88         if(h == NULL)
             89             break;
             90         ret = mpg123_open(h, ".\\orgrimmar_intro-moment.mp3");
             91         if(ret != MPG123_OK)
             92             break;
             93 
             94         off_t framenum = mpg123_seek_frame(h, 0, SEEK_SET);
             95 
             96         WAVE_HEADER header;
             97         unsigned char *audio = NULL;
             98         size_t bytes = 0;
             99         int mc = mpg123_decode_frame(h, &framenum, &audio, &bytes);
            100         if(mc == MPG123_NEW_FORMAT)
            101         {
            102             long rate = 0;
            103             int channel = 0, format = 0;
            104             ret = mpg123_getformat(h, &rate, &channel, &format);
            105             if(ret != MPG123_OK)
            106                 break;
            107             mpg123_frameinfo fi;
            108             ret = mpg123_info(h, &fi);
            109             if(ret != MPG123_OK)
            110                 break;
            111 
            112             InitWaveHeader(header, channel, rate, 0);
            113         }
            114         header.data_size = 0;
            115 
            116         UpdateWaveHeader(header, true);
            117 
            118         ++ framenum;
            119         mc = mpg123_decode_frame(h, &framenum, &audio, &bytes);
            120         while(mc == MPG123_OK && bytes > 0)
            121         {
            122             header.data_size += bytes;
            123 
            124             AppendWaveData((const char*)audio, bytes);
            125 
            126             mc = mpg123_decode_frame(h, &framenum, &audio, &bytes);
            127             ++ framenum;
            128         }
            129 
            130         mpg123_delete(h);
            131         mpg123_exit();
            132 
            133         header.waveform_chunk_size = header.data_size + 36;
            134 
            135         UpdateWaveHeader(header, false);
            136 
            137         break;
            138     }
            139 
            140     if(ret != MPG123_OK)
            141     {
            142             std::cout << "error : " << mpg123_plain_strerror(ret) << std::endl;
            143             return -1;
            144     }
            145 
            146     CloseWaveFile();
            147 
            148     return 0;
            149 }
            150 

                收工,睡覺,心滿意足~~:)

            posted on 2009-03-25 00:27 codejie 閱讀(1870) 評論(2)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: 使用libmpg123轉換MP3到WAVE 2009-06-19 07:10 Q304321141

            為什么我這里連mpg123.h都編譯不通過呢?

            如果方便的話能不能給與一些指點?  回復  更多評論   

            # re: 使用libmpg123轉換MP3到WAVE 2009-06-22 09:53 codejie

            @Q304321141
            編譯啥錯誤?  回復  更多評論   

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            日产精品99久久久久久| 97精品伊人久久久大香线蕉| 国产精品成人99久久久久91gav| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久人妻AV中文字幕| 久久国产精品一国产精品金尊| 久久香蕉国产线看观看99| 三级韩国一区久久二区综合| 亚洲中文字幕无码久久2017| 久久精品国产亚洲欧美| 无码国内精品久久综合88| 精品久久一区二区| 伊人久久大香线蕉AV色婷婷色| 久久久国产精品网站| 久久丫忘忧草产品| 亚洲乱亚洲乱淫久久| 亚洲中文字幕久久精品无码APP| 久久久久久国产a免费观看不卡| 久久精品国产亚洲AV电影| 99久久综合国产精品免费| 91精品无码久久久久久五月天 | 丁香五月网久久综合| 精品国产日韩久久亚洲| 久久成人精品| 99久久精品免费看国产| 精品999久久久久久中文字幕| 久久精品国产久精国产果冻传媒| 99久久99久久精品国产片果冻| 久久中文骚妇内射| 亚洲精品乱码久久久久久蜜桃不卡 | 欧美午夜精品久久久久久浪潮| 国产精品久久国产精品99盘| 久久综合给久久狠狠97色| 综合人妻久久一区二区精品| 久久久久久久免费视频| 综合久久一区二区三区 | 成人亚洲欧美久久久久| 久久这里只有精品久久| 99久久亚洲综合精品网站| 色综合合久久天天综合绕视看| 99久久无码一区人妻|