日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows下使用waveOut播放音频pcm

發布時間:2024/3/26 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
值為?NULLNULL

? ? ?參數dwInstance用于傳遞給回調機制的用戶實例數據。

? ? ?參數fdwOpen用于打開設備的標志。其值如下(部分)

Value含義
CALLBACK_EVENTdwCallback?參數是事件句柄。
CALLBACK_FUNCTIONdwCallback?參數是回調過程地址。
CALLBACK_NULL無回調機制。 這是默認設置。
CALLBACK_THREADdwCallback?參數是線程標識符。
CALLBACK_WINDOWdwCallback?參數是窗口句柄。

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。