• <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)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久人人爽人人爽人人av东京热| 日韩人妻无码一区二区三区久久| 丁香五月网久久综合| 国内精品久久久久| 国产综合免费精品久久久| 日韩久久久久中文字幕人妻| 中文字幕无码久久人妻| 久久午夜无码鲁丝片秋霞 | 色播久久人人爽人人爽人人片aV| 国产午夜精品久久久久九九| 久久人人爽人人人人片av| 国产午夜精品久久久久免费视| 一本久久a久久精品综合夜夜| 国产69精品久久久久观看软件| 一本一本久久aa综合精品| 9999国产精品欧美久久久久久| 久久久久久久综合狠狠综合| 欧美激情精品久久久久| 久久久久人妻一区二区三区| 久久这里只精品国产99热| 欧美精品国产综合久久| 久久91精品综合国产首页| 久久精品一本到99热免费| 无码任你躁久久久久久老妇| 国产成人精品久久亚洲| 精品999久久久久久中文字幕| 77777亚洲午夜久久多人| 国产成人久久激情91| 久久久久久人妻无码| 久久天天婷婷五月俺也去| 久久亚洲AV永久无码精品| 久久伊人精品青青草原日本| 亚洲国产精品一区二区久久| 久久久久人妻精品一区二区三区| 精品一二三区久久aaa片| 久久频这里精品99香蕉久| 久久男人AV资源网站| 久久国产福利免费| 99久久无码一区人妻| 91麻豆精品国产91久久久久久| 国产精品久久国产精品99盘|