• <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>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0

            [轉貼]音頻錄入

            一、數字音頻基礎知識
            Fourier級數:
            任何周期的波形可以分解成多個正弦波,這些正弦波的頻率都是整數倍。級數中其他正線波的頻率是基礎頻率的整數倍。基礎頻率稱為一級諧波。

            PCM:
            pulse code modulation,脈沖編碼調制,即對波形按照固定周期頻率采樣。為了保證采樣后數據質量,采樣頻率必須是樣本聲音最高頻率的兩倍,這就是Nyquist頻率。
            樣本大小:采樣后用于存儲振幅級的位數,實際就是脈沖編碼的階梯數,位數越大表明精度越高,這一點學過數字邏輯電路的應該清楚。

            聲音強度:
            波形振幅的平方。兩個聲音強度上的差常以分貝(db)為單位來度量,

            計算公式如下:
            20*log(A1/A2)分貝。A1,A2為兩個聲音的振幅。如果采樣大小為8位,則采樣的動態范圍為20*log(256)分貝=48db。如果樣本大小為16位,則采樣動態范圍為20*log(65536)大約是96分貝,接近了人聽覺極限和痛苦極限,是再線音樂的理想范圍。windows同時支持8位和16位的采樣大小。

            二、相關API函數,結構,消息
            對于錄音設備來說,windows 提供了一組wave***的函數,比較重要的有以下幾個:

            打開錄音設備函數
            MMRESULT waveInOpen(
            LPHWAVEIN phwi, //輸入設備句柄
            UINT uDeviceID, //輸入設備ID
            LPWAVEFORMATEX pwfx, //錄音格式指針
            DWORD dwCallback, //處理MM_WIM_***消息的回調函數或窗口句柄,線程ID
            DWORD dwCallbackInstance,
            DWORD fdwOpen //處理消息方式的符號位
            );
            為錄音設備準備緩存函數
            MMRESULT waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT bwh );
            給輸入設備增加一個緩存
            MMRESULT waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh );
            開始錄音
            MMRESULT waveInStart( HWAVEIN hwi );
            清除緩存
            MMRESULT waveInUnprepareHeader( HWAVEIN hwi,LPWAVEHDR pwh, UINT cbwh);
            停止錄音
            MMRESULT waveInReset( HWAVEIN hwi );
            關閉錄音設備
            MMRESULT waveInClose( HWAVEIN hwi );
            Wave_audio數據格式
            typedef struct {
            WORD wFormatTag; //數據格式,一般為WAVE_FORMAT_PCM即脈沖編碼
            WORD nChannels; //聲道
            DWORD nSamplesPerSec; //采樣頻率
            DWORD nAvgBytesPerSec; //每秒數據量
            WORD nBlockAlign;
            WORD wBitsPerSample;//樣本大小
            WORD cbSize;
            } WAVEFORMATEX;
            waveform-audio 緩存格式 
            typedef struct {
            LPSTR lpData; //內存指針
            DWORD dwBufferLength;//長度
            DWORD dwBytesRecorded; //已錄音的字節長度
            DWORD dwUser;
            DWORD dwFlags;
            DWORD dwLoops; //循環次數
            struct wavehdr_tag * lpNext;
            DWORD reserved;
            } WAVEHDR;
            相關消息 
            MM_WIM_OPEN:打開設備時消息,在此期間我們可以進行一些初始化工作
            MM_WIM_DATA:當緩存已滿或者停止錄音時的消息,處理這個消息可以對緩存進行重新分配,實現不限長度錄音
            MM_WIM_CLOSE:關閉錄音設備時的消息。
            相對于錄音來說,回放就簡單的多了,用到的函數主要有以下幾個:
            打開回放設備 
            MMRESULT waveOutOpen(LPHWAVEOUT phwo, UINT uDeviceID, LPWAVEFORMATEX pwfx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen );
            為回放設備準備內存塊 
            MMRESULT waveOutPrepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );

            寫數據(放音) 
            MMRESULT waveOutWrite(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh );
            相應的也有三個消息,用法跟錄音的類似:

            三、程序設計

            一個錄音程序的簡單流程: 打開錄音設備waveInOpen===>準備wave數據頭waveInPrepareHeader===>
            準備數據塊waveInAddBuffer===>開始錄音waveInStart===>停止錄音(waveInReset) ===>
            關閉錄音設備(waveInClose)
            當開始錄音后當buffer已滿時,將收到MM_WIM_DATA消息,處理該消息可以保存已錄好數據。

            回放程序比這個要簡單的多: 打開回放設備waveOutOpen===>準備wave數據頭waveOutPrepareHeader===>寫wave數據waveOutWrite===>
            停止放音(waveOutRest) ===>關閉回放設備(waveOutClose)
            如何處理MM消息: MSDN告訴我們主要有 CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW 三種方式,常用的是
            Thread,window方式。
            線程模式
            waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,m_ThreadID,NULL,CALLBACK_THREAD),我們可以繼承MFC的CwinThread類,只要相應的處理線程消息即可。
            MFC線程消息的宏為:

            ON_THREAD_MESSAGE,
            可以這樣添加消息映射: ON_THREAD_MESSAGE(MM_WIM_CLOSE, OnMM_WIM_CLOSE)
            窗口模式
            類似于線程模式,參見源程序即可

            posted on 2006-06-15 06:57 Jerry Cat 閱讀(1163) 評論(0)  編輯 收藏 引用

            <2006年5月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久这里只有精品18| 久久精品国产亚洲一区二区| 国产精品禁18久久久夂久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久人妻少妇嫩草AV无码蜜桃| 天堂无码久久综合东京热| 久久精品国产第一区二区三区| 色成年激情久久综合| 亚洲午夜久久久久久久久电影网| 久久国产精品国产自线拍免费| 亚洲精品无码久久久| 日韩精品久久久久久| 韩国无遮挡三级久久| 国产精品女同久久久久电影院| 久久久女人与动物群交毛片| 色88久久久久高潮综合影院| 久久这里只精品99re66| 亚洲人成伊人成综合网久久久| 狠狠色婷婷久久综合频道日韩| 亚洲伊人久久成综合人影院| 亚洲国产天堂久久久久久| 久久久久久久女国产乱让韩| 一本久道久久综合狠狠爱| 久久精品国产亚洲AV麻豆网站| 国产成人精品白浆久久69 | 婷婷综合久久狠狠色99h| 色综合久久久久| 77777亚洲午夜久久多人| 国产叼嘿久久精品久久| 伊人久久大香线蕉综合网站| 亚洲精品乱码久久久久久| 久久亚洲国产成人精品性色| 久久国产精品-国产精品| 久久中文字幕人妻丝袜| 久久精品国内一区二区三区| 色播久久人人爽人人爽人人片aV | 蜜桃麻豆WWW久久囤产精品| 久久狠狠爱亚洲综合影院 | 久久香蕉国产线看观看猫咪?v| 人妻少妇久久中文字幕| 久久免费99精品国产自在现线 |