程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用WindowsAPI獲取錄音音頻,windowsapi獲取音頻

使用WindowsAPI獲取錄音音頻,windowsapi獲取音頻

編輯:C++入門知識

使用WindowsAPI獲取錄音音頻,windowsapi獲取音頻


嚴禁轉載

介紹使用winmm.h進行音頻流的獲取

 

首先需要包含以下引用對象

#include <Windows.h>
#include "mmsystem.h"
#pragma comment(lib, "winmm.lib")

音頻的獲取需要調用7個函數

1. waveInGetNumDevs:返回系統中就緒的波形聲音輸入設備的數量

UINT waveInGetNumDevs(VOID);

2. waveInGetDevCaps:檢查指定波形輸入設備的特性

MMRESULT waveInGetDevCaps( 
  UINT_PTR     uDeviceID,  
  LPWAVEINCAPS pwic,       
  UINT         cbwic       
);
//uDeviceID 音頻輸入設備標識,也可以為一個打開的音頻輸入設備的句柄.
//    個人認為如果上一步獲得了多個設備,可以用索引標識每一個設備.
//    
//pwic 對WAVEINCAPS結構體的一個指針,包含設備的音頻特性.
//
//cbwic WAVEINCAPS結構體的大小,使用sizeof即可.
//
//MMRESULT 函數執行的結果
//    MMSYSERR_NOERROR 表示執行成功
//    MMSYSERR_BADDEVICEID 索引越界 
//    MMSYSERR_NODRIVER 沒有就緒的設備 
//    MMSYSERR_NOMEM 不能分配或者鎖定內存

 介紹WAVEINCAPS結構體的含義

typedef struct { 
    WORD      wMid;                //音頻設備制造商定義的驅動程序標識
    WORD      wPid;                //音頻輸入設備的產品標識
    MMVERSION vDriverVersion;        //驅動程序版本號
    TCHAR     szPname[MAXPNAMELEN];//制造商名稱
    DWORD     dwFormats;            //支持的格式,參見MSDN
    WORD      wChannels;            //支持的聲道數
    WORD      wReserved1;            //保留參數
} WAVEINCAPS;

3. waveInOpen:打開指定的音頻輸入設備,進行錄音

MMRESULT waveInOpen(
  LPHWAVEIN       phwi,                //接收打開的音頻輸入設備標識的HWAVEIN結構的指針
  UINT_PTR       uDeviceID,            //指定一個需要打開的設備標識.可以使用WAVE_MAPPER選擇一個按指定錄音格式錄音的設備
  LPWAVEFORMATEX pwfx,                //一個所需的格式進行錄音的WAVEFORMATEX結構的指針 
  DWORD_PTR      dwCallback,        //指向一個回調函數、事件句柄、窗口句柄、線程標識,對錄音事件進行處理.
  DWORD_PTR      dwCallbackInstance, //傳給回調機制的參數
  DWORD          fdwOpen            //打開設備的方法標識,指定回調的類型.參見CSDN
);

介紹WAVEFORMATEX結構體的含義

typedef struct { 
    WORD  wFormatTag;        //波形聲音的格式,單聲道雙聲道使用WAVE_FORMAT_PCM.當包含在WAVEFORMATEXTENSIBLE結構中時,使用WAVE_FORMAT_EXTENSIBLE.
    WORD  nChannels;        //聲道數量
    DWORD nSamplesPerSec;    //采樣率.wFormatTag為WAVE_FORMAT_PCM時,有8.0kHz,11.025kHz,22.05kHz,和44.1kHz.
    DWORD nAvgBytesPerSec;    //每秒的采樣字節數.通過nSamplesPerSec * nChannels * wBitsPerSample / 8計算
    WORD  nBlockAlign;        //每次采樣的字節數.通過nChannels * wBitsPerSample / 8計算
    WORD  wBitsPerSample;    //采樣位數.wFormatTag為WAVE_FORMAT_PCM時,為8或者16
    WORD  cbSize;            //wFormatTag為WAVE_FORMAT_PCM時,忽略此參數
} WAVEFORMATEX;

介紹dwCallback回調函數格式

void CALLBACK waveInProc(
  HWAVEIN hwi,          //回調此函數的設備句柄
  UINT uMsg,            //波形聲音輸入信息,標識關閉(WIM_CLOSE)、緩沖區滿(WIM_DATA)、打開(WIM_OPEN).
  DWORD_PTR dwInstance, //用戶在waveInOpen指定的數據
  DWORD_PTR dwParam1,   //(LPWAVEHDR)dwParam1,用戶指定的緩沖區
  DWORD_PTR dwParam2     
);

4. waveInPrepareHeader:為音頻輸入設備准備一個緩沖區

MMRESULT waveInPrepareHeader(
  HWAVEIN hwi,    //音頻輸入設備句柄
  LPWAVEHDR pwh,//指向WAVEHDR結構的指針,標識准備的緩沖區
  UINT cbwh        //WAVEHDR結構的大小,使用sizeof即可
);


介紹WAVEHDR結構

typedef struct wavehdr_tag { 
    LPSTR      lpData;          //指向波形格式的緩沖區
    DWORD      dwBufferLength;  //緩沖區的大小
    DWORD      dwBytesRecorded; //當前存儲了多少數據
    DWORD_PTR  dwUser;          //用戶數據
    DWORD      dwFlags;            //為緩沖區提供的信息,在waveInPrepareHeader函數中使用WHDR_PREPARED
    DWORD      dwLoops;         //輸出時使用,標識播放次數
    struct wavehdr_tag * lpNext;//reserved
    DWORD_PTR reserved;         //reserved
} WAVEHDR, *LPWAVEHDR; 

5. waveInAddBuffer:將緩沖區發送給設備,若緩沖區填滿,則不起作用。(參數同上)

MMRESULT waveInAddBuffer(
  HWAVEIN hwi, 
  LPWAVEHDR pwh, 
  UINT cbwh 
); 

6. waveInStart:開始進行錄制

MMRESULT waveInStart(
  HWAVEIN hwi  //設備句柄
);

7. waveInClose:關閉設備

MRESULT waveInClose(
  HWAVEIN hwi  //設備句柄
);

 如下示例:

http://download.csdn.net/detail/long7782/7771019

 


Windows 自帶的錄音機怎使用?可以錄制電腦裡自己播放的音頻文件不?

錄制電腦自己播放的聲音是可以的,你需要在錄音選項中調整錄音選項為立體聲混音,方法如下:雙擊小喇叭,選擇選項-錄音-立體聲混音。如果選擇話筒,就是通過話筒錄音,如果選擇立體聲混音,就是系統內錄。注意,音量太大會爆音,所以要多測試幾次調整到最佳音量。還有,系統自帶錄音機一般時間不會太久,1分鐘就停止了,建議你下載其他錄音軟件來錄,推薦goldwave。
 

使用Windows XP自帶的“錄音機”錄制出來的音頻文件的格式是什?

wav
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved