windows下使用waveOut播放音频pcm
目錄
一、前言
二、waveOut主要API介紹
三、waveOut播放PCM音頻框架
《Windows平臺使用waveOut播放PCM數據代碼實現》鏈接:
https://edu.csdn.net/learn/38258/606147?spm=1003.2001.3001.4157
一、前言
? ? ? ?在<windows下directShow音視頻采集>一篇文章中就介紹了windows下通過directShow音視頻采集的流程。windows下directShow不僅可以對音進行采也可以對音頻進行播放,但是directShow使用過程較為復雜,所以本文將介紹windows下使用WAVE播放音頻的過程。在微軟的官方SDK文檔說明中就對WAVE播放音頻的API做了詳細的介紹,連接為<wave播放音頻的API介紹>。
二、waveOut主要API介紹
1、waveOutOpen()
? ? ? ? waveOutOpen函數的詳細定義如下,該函數用于打開用于播放音頻的輸出設備。
MMRESULT waveOutOpen(LPHWAVEOUT phwo,UINT uDeviceID,LPCWAVEFORMATEX pwfx,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen );? ? ?參數是phwo是存放wave音頻輸出設備的句柄的指針;
? ? ?參數uDeviceID是wave設備標識ID,當參數為WAVE_MAPPER時候標識可以播放給定格式的音頻數據。
? ? 參數pwfx用于設置要播放的音頻數據格式。其結構體類型WAVEFORMATEX定義如下。
typedef struct tWAVEFORMATEX {WORD wFormatTag; /* format type */WORD nChannels; /* number of channels (i.e. mono, stereo...) */DWORD nSamplesPerSec; /* sample rate */DWORD nAvgBytesPerSec; /* for buffer estimation */WORD nBlockAlign; /* block size of data */WORD wBitsPerSample; /* number of bits per sample of mono data */WORD cbSize; /* the count in bytes of the size of *//* extra information (after cbSize) */ } WAVEFORMATEX;? ? ? 參數dwCallback用于指定回調的機制;當前支持的回調機制包含如下;
| 指向回調函數的指針 | A pointer to a callback function |
| 窗口的句柄 | A handle to a window |
| 線程標識符 | A thread identifier |
| 事件的句柄 | A handle to an event |
| 值為?NULL | NULL |
? ? ?參數dwInstance用于傳遞給回調機制的用戶實例數據。
? ? ?參數fdwOpen用于打開設備的標志。其值如下(部分)
| CALLBACK_EVENT | dwCallback?參數是事件句柄。 |
| CALLBACK_FUNCTION | dwCallback?參數是回調過程地址。 |
| CALLBACK_NULL | 無回調機制。 這是默認設置。 |
| CALLBACK_THREAD | dwCallback?參數是線程標識符。 |
| CALLBACK_WINDOW | dwCallback?參數是窗口句柄。 |
2、waveOutPrepareHeader()
? ? ? waveOutPrepareHeader函數的定義如下,該函數用于準備wave音頻數據塊以供播放。
MMRESULT waveOutPrepareHeader(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh );? ? ? 參數hwo為wave音頻輸出設備的句柄,即waveOutOpen的第一個參數值。
? ? ? 參數pwh指向要發送的音頻數據。其結構體定義如下。
/* wave data block header */ typedef struct wavehdr_tag {LPSTR lpData; /* pointer to locked data buffer */DWORD dwBufferLength; /* length of data buffer */DWORD dwBytesRecorded; /* used for input only */DWORD_PTR dwUser; /* for client's use */DWORD dwFlags; /* assorted flags (see defines) */DWORD dwLoops; /* loop control counter */struct wavehdr_tag FAR *lpNext; /* reserved for driver */DWORD_PTR reserved; /* reserved for driver */ } WAVEHDR;? ? ? ?參數cbwh為WAVEHDR?結構的大小,通常取值為sizeof(WAVEHDR)。
3、waveOutWrite()
? ? ? ?waveOutWrite函數的定義如下,該函數用于發送一個數據給音頻播放設備。
MMRESULT waveOutWrite(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh );? ? 參數hwo為wave音頻輸出設備的句柄,即waveOutOpen的第一個參數值。
? ? 參數pwh指向要發送的音頻數據。
? ? 參數cbwh為WAVEHDR?結構的大小,通常取值為sizeof(WAVEHDR)。
? 4、除了上訴三個API,在使用wave播放PCM音頻還會用到CreateEvent、CloseHandle和WaitForSingleObject函數。CreateEvent用于創建事件。CloseHandle用于關閉事件。WaitForSingleObject用于觀察線程信號狀態,當線程信號狀態為事件則返回;其定義如下
WaitForSingleObject(_In_ HANDLE hHandle,_In_ DWORD dwMilliseconds);? ? ? 參數hHandle為CreateEvent創建事件的句柄;
? ? ? 參數dwMilliseconds為超時等待的參數。
5、waveOutClose(_In_ HWAVEOUT hwo)
? ? ?該函數用于關閉已經打開的wave音頻播放設備。
? ? ?參數hwo為wave音頻輸出設備的句柄;
三、waveOut播放PCM音頻框架
總結
以上是生活随笔為你收集整理的windows下使用waveOut播放音频pcm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电阻入门知识
- 下一篇: 最新springboot选题推荐-商品物