• <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 閱讀(1867) 評論(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)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲欧洲精品成人久久奇米网| 久久久久久噜噜精品免费直播| 日韩久久无码免费毛片软件| 国产精品美女久久久久网| 97精品伊人久久久大香线蕉 | 久久亚洲色一区二区三区| …久久精品99久久香蕉国产| 久久久久亚洲AV无码麻豆| 久久久这里有精品| 伊人热热久久原色播放www| 久久久久亚洲爆乳少妇无 | 久久国产精品成人影院| 无码人妻久久一区二区三区免费| 久久精品国产亚洲AV蜜臀色欲| 91麻豆国产精品91久久久| 久久人人爽人人人人爽AV| 无码专区久久综合久中文字幕| 亚洲av伊人久久综合密臀性色| 久久综合狠狠综合久久综合88| 久久男人Av资源网站无码软件 | 久久亚洲AV无码西西人体| 久久AV无码精品人妻糸列| 久久精品毛片免费观看| 一本久久a久久精品综合夜夜| 久久国产精品视频| 国内精品久久久久影院亚洲| 婷婷综合久久中文字幕蜜桃三电影 | 久久亚洲欧洲国产综合| 久久丝袜精品中文字幕| 国产美女亚洲精品久久久综合| 精品一久久香蕉国产线看播放 | 久久青青国产| 狠狠色丁香久久婷婷综合_中| 精品少妇人妻av无码久久| 99热都是精品久久久久久| 中文字幕无码av激情不卡久久| 亚洲欧美日韩中文久久| 国产真实乱对白精彩久久| 亚洲欧美日韩久久精品第一区| 久久久久国产亚洲AV麻豆| 国产精品久久久久…|