• <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 閱讀(1874) 評論(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久久精品毛片免费播放| 思思久久99热只有频精品66| 精品国产乱码久久久久久1区2区| 国产精品99精品久久免费| 99久久国产主播综合精品 | 久久丫精品国产亚洲av不卡| 久久99国产乱子伦精品免费| 久久精品二区| 国产精品对白刺激久久久| 思思久久99热免费精品6| 97久久久精品综合88久久| 亚洲国产成人久久综合一区77| 久久久久久国产精品无码超碰| 亚洲精品乱码久久久久久不卡| 国产亚洲欧美成人久久片 | 久久无码人妻一区二区三区午夜| 日韩精品国产自在久久现线拍| 久久人人爽人人爽人人av东京热| 亚洲国产精品热久久| 色8久久人人97超碰香蕉987| 午夜视频久久久久一区| 久久久久国产视频电影| 久久久中文字幕| 精品久久久久久久| 久久99精品久久久久久hb无码| 久久亚洲精品无码VA大香大香| 久久婷婷色综合一区二区| 久久WWW免费人成—看片| 欧美久久综合性欧美| 国产一区二区三区久久精品| 97久久天天综合色天天综合色hd | 久久久中文字幕日本| 精品久久久久久无码国产| 亚洲国产成人久久综合一 | 亚洲综合精品香蕉久久网97 | 久久精品国产清自在天天线 | 午夜精品久久久久久影视777 | 国产精品99久久久久久人| 久久99中文字幕久久| 岛国搬运www久久| 亚洲精品成人网久久久久久|