• <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精品久久久久久| 2020国产成人久久精品| 国产精品久久久久无码av| 伊人色综合久久天天| 久久精品国产精品亚洲精品 | 久久国产一片免费观看| 亚洲人成网亚洲欧洲无码久久 | 久久最新免费视频| 国产成人综合久久精品红| 潮喷大喷水系列无码久久精品| 伊人久久无码精品中文字幕| 久久精品不卡| 久久久久99精品成人片直播| 人妻精品久久无码区| 亚洲日韩中文无码久久| 久久国产高清一区二区三区| 国产午夜福利精品久久| 日本久久久久久中文字幕| 久久精品国内一区二区三区| 久久se精品一区二区| 久久久久亚洲AV无码观看| 99久久亚洲综合精品网站| 色婷婷久久综合中文久久蜜桃av| 久久久久久久国产免费看| 久久香蕉一级毛片| 久久久久女人精品毛片| 久久久久高潮综合影院| 伊人久久一区二区三区无码| 国产精品99久久久久久董美香| 久久久国产精品亚洲一区| 久久综合国产乱子伦精品免费| 久久精品国产亚洲av瑜伽| 国产午夜久久影院| 狠狠色丁香婷综合久久| 久久精品国产半推半就| 成人国内精品久久久久影院| 久久综合香蕉国产蜜臀AV| 精品永久久福利一区二区| 久久天天躁狠狠躁夜夜网站 | 精品伊人久久久| 国产精品久久久久久五月尺|