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

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            音頻編解碼·實(shí)戰(zhàn)篇(1)PCM轉(zhuǎn)至AAC(AAC編碼)

            轉(zhuǎn)載自:http://blog.csdn.net/Poechant/article/details/7435054

            • 作者:柳大·Poechant
            • 博客:blog.csdn.net/poechant
            • 郵箱:zhongchao.ustc@gmail.com
            • 日期:April 7th, 2012

            這里利用FAAC來實(shí)現(xiàn)AAC編碼。

            1 下載安裝 FAAC

            這里的安裝過程是在 Mac 和 Linux 上實(shí)現(xiàn)的,Windows可以類似參考。

            wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz
            tar zxvf faac-1.28.tar.gz
            cd faac-1.28
            ./configure
            make
            sudo make install
            

            如果才用默認(rèn)的 configure 中的 prefix path,那么安裝后的 lib 和 .h 文件分別在/usr/local/lib/usr/local/include,后面編譯的時(shí)候會(huì)用到。

            如果編譯過程中發(fā)現(xiàn)錯(cuò)誤:

            mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’
            

            解決方法:

            從123行開始修改此文件mpeg4ip.h,到129行結(jié)束。 修改前:

            #ifdef __cplusplus
            extern "C" {
            #endif
            char *strcasestr(const char *haystack, const char *needle);
            #ifdef __cplusplus
            }
            #endif
            

            修改后:

            #ifdef __cplusplus
            extern "C++" {
            #endif
            const char *strcasestr(const char *haystack, const char *needle);
            #ifdef __cplusplus
            }
            #endif
            

            2 FAAC API

            2.1 Open FAAC engine

            Prototype:

            faacEncHandle faacEncOpen               // 返回一個(gè)FAAC的handle
            (                   
                unsigned long   nSampleRate,        // 采樣率,單位是bps
                unsigned long   nChannels,          // 聲道,1為單聲道,2為雙聲道
                unsigned long   &nInputSamples,     // 傳引用,得到每次調(diào)用編碼時(shí)所應(yīng)接收的原始數(shù)據(jù)長(zhǎng)度
                unsigned long   &nMaxOutputBytes    // 傳引用,得到每次調(diào)用編碼時(shí)生成的AAC數(shù)據(jù)的最大長(zhǎng)度
            );
            

            2.2 Get/Set encoding configuration

            Prototype:

            獲取編碼器的配置:

            faacEncConfigurationPtr faacEncGetCurrentConfiguration // 得到指向當(dāng)前編碼器配置的指針
            (
                faacEncHandle hEncoder  // FAAC的handle
            );
            

            設(shè)定編碼器的配置:

            int FAACAPI faacEncSetConfiguration
            (
                faacDecHandle hDecoder,         // 此前得到的FAAC的handle
                faacEncConfigurationPtr config  // FAAC編碼器的配置
            );
            

            2.3 Encode

            Prototype:

            int faacEncEncode
            (
                faacEncHandle hEncoder,     // FAAC的handle
                short *inputBuffer,         // PCM原始數(shù)據(jù)
                unsigned int samplesInput,  // 調(diào)用faacEncOpen時(shí)得到的nInputSamples值
                unsigned char *outputBuffer,// 至少具有調(diào)用faacEncOpen時(shí)得到的nMaxOutputBytes字節(jié)長(zhǎng)度的緩沖區(qū)
                unsigned int bufferSize     // outputBuffer緩沖區(qū)的實(shí)際大小
            );
            

            2.4 Close FAAC engine

            Prototype

            void faacEncClose
            (
                faacEncHandle hEncoder  // 此前得到的FAAC handle
            );
            

            3 流程

            3.1 做什么準(zhǔn)備?

            采樣率,聲道數(shù)(雙聲道還是單聲道?),還有你的PCM的單個(gè)樣本是8位的還是16位的?

            3.2 開啟FAAC編碼器,做編碼前的準(zhǔn)備

            1. 調(diào)用faacEncOpen開啟FAAC編碼器后,得到了單次輸入樣本數(shù)nInputSamples和輸出數(shù)據(jù)最大字節(jié)數(shù)nMaxOutputBytes
            2. 根據(jù)nInputSamplesnMaxOutputBytes,分別為PCM數(shù)據(jù)和將要得到的AAC數(shù)據(jù)創(chuàng)建緩沖區(qū);
            3. 調(diào)用faacEncGetCurrentConfiguration獲取當(dāng)前配置,修改完配置后,調(diào)用faacEncSetConfiguration設(shè)置新配置。

            3.3 開始編碼

            調(diào)用faacEncEncode,該準(zhǔn)備的剛才都準(zhǔn)備好了,很簡(jiǎn)單。

            3.4 善后

            關(guān)閉編碼器,另外別忘了釋放緩沖區(qū),如果使用了文件流,也別忘記了關(guān)閉。

            4 測(cè)試程序

            4.1 完整代碼

            PCM格式音頻文件/home/michael/Development/testspace/in.pcm轉(zhuǎn)至AAC格式文件/home/michael/Development/testspace/out.aac

            #include <faac.h>
            #include <stdio.h>
            
            typedef unsigned long   ULONG;
            typedef unsigned int    UINT;
            typedef unsigned char   BYTE;
            typedef char            _TCHAR;
            
            int main(int argc, _TCHAR* argv[])
            {
                ULONG nSampleRate = 11025;  // 采樣率
                UINT nChannels = 1;         // 聲道數(shù)
                UINT nPCMBitSize = 16;      // 單樣本位數(shù)
                ULONG nInputSamples = 0;
                ULONG nMaxOutputBytes = 0;
            
                int nRet;
                faacEncHandle hEncoder;
                faacEncConfigurationPtr pConfiguration; 
            
                int nBytesRead;
                int nPCMBufferSize;
                BYTE* pbPCMBuffer;
                BYTE* pbAACBuffer;
            
                FILE* fpIn; // PCM file for input
                FILE* fpOut; // AAC file for output
            
                fpIn = fopen("/home/michael/Development/testspace/in.pcm", "rb");
                fpOut = fopen("/home/michael/Development/testspace/out.aac", "wb");
            
                // (1) Open FAAC engine
                hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
                if(hEncoder == NULL)
                {
                    printf("[ERROR] Failed to call faacEncOpen()\n");
                    return -1;
                }
            
                nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
                pbPCMBuffer = new BYTE [nPCMBufferSize];
                pbAACBuffer = new BYTE [nMaxOutputBytes];
            
                // (2.1) Get current encoding configuration
                pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
                pConfiguration->inputFormat = FAAC_INPUT_16BIT;
            
                // (2.2) Set encoding configuration
                nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
            
                for(int i = 0; 1; i++)
                {
                    // 讀入的實(shí)際字節(jié)數(shù),最大不會(huì)超過nPCMBufferSize,一般只有讀到文件尾時(shí)才不是這個(gè)值
                    nBytesRead = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn);
            
                    // 輸入樣本數(shù),用實(shí)際讀入字節(jié)數(shù)計(jì)算,一般只有讀到文件尾時(shí)才不是nPCMBufferSize/(nPCMBitSize/8);
                    nInputSamples = nBytesRead / (nPCMBitSize / 8);
            
                    // (3) Encode
                    nRet = faacEncEncode(
                    hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);
            
                    fwrite(pbAACBuffer, 1, nRet, fpOut);
            
                    printf("%d: faacEncEncode returns %d\n", i, nRet);
            
                    if(nBytesRead <= 0)
                    {
                        break;
                    }
                }
            
                /*
                while(1)
                {
                    // (3) Flushing
                    nRet = faacEncEncode(
                    hEncoder, (int*) pbPCMBuffer, 0, pbAACBuffer, nMaxOutputBytes);
            
                    if(nRet <= 0)
                    {
                        break;
                    }
                }
                */
            
                // (4) Close FAAC engine
                nRet = faacEncClose(hEncoder);
            
                delete[] pbPCMBuffer;
                delete[] pbAACBuffer;
                fclose(fpIn);
                fclose(fpOut);
            
                //getchar();
            
                return 0;
            }
            

            4.2 編譯運(yùn)行

            將上述代碼保存為“pcm2aac.cpp”文件,然后編譯:

            g++ pcm2aac.cpp -o pcm2aac -L/usr/local/lib -lfaac -I/usr/local/include
            

            運(yùn)行:

            ./pcm2aac
            

            然后就生成了out.aac文件了,聽聽看吧!~

            5 Reference

            1. AudioCoding.com - FAAC
            2. Dogfoot – ??? ??

            -

            轉(zhuǎn)載請(qǐng)注明來自柳大的CSDN博客:blog.csdn.net/poechant

            posted on 2013-01-31 15:42 楊粼波 閱讀(6603) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99久久99久久久精品齐齐| 久久亚洲欧洲国产综合| 精品久久久无码人妻中文字幕豆芽| 久久久久久国产精品美女| 久久精品中文无码资源站| 久久A级毛片免费观看| 99久久精品这里只有精品| 四虎国产精品成人免费久久| 亚洲色婷婷综合久久| 人人狠狠综合久久亚洲88| 伊人久久大香线蕉精品不卡| 亚洲av伊人久久综合密臀性色| 国产综合久久久久久鬼色| 久久久久久久亚洲精品| 亚洲AV日韩精品久久久久久| 99精品伊人久久久大香线蕉| 久久久亚洲AV波多野结衣| 久久精品国产91久久麻豆自制| 一本大道久久东京热无码AV| 精品久久8x国产免费观看| 久久亚洲色一区二区三区| 99久久精品国内| 免费精品久久天干天干| 久久精品国产亚洲一区二区| 精品综合久久久久久97| 亚洲午夜精品久久久久久人妖| 18岁日韩内射颜射午夜久久成人| 国产—久久香蕉国产线看观看| 国产成人精品久久| 久久精品免费网站网| 久久精品黄AA片一区二区三区| 污污内射久久一区二区欧美日韩| 国产精品久久久久久久久鸭 | 欧美亚洲国产精品久久| 欧洲性大片xxxxx久久久| 丁香五月网久久综合| 伊人色综合久久天天人手人婷| 人人狠狠综合久久亚洲高清| 国产精品成人久久久久三级午夜电影| 无码国产69精品久久久久网站| 伊色综合久久之综合久久|