直接上代碼,如果有需要可以直接建一個win32控制台程序然后將代碼拷過去改個文件名就可以用了(注意將聲道和頻率與你自己的文件對應哦)。當然我自己也用VS2008(VS2013好用太多,強烈推薦還是用VS2013,只是它的工程太大,上傳起來相當費勁,所以還是用VS2008重寫了。。)寫了個例子上傳了,如果有需要下載地址如下(自己沒什么下載分了,所以弄了3分,見諒哈哈):點擊打開鏈接
這份代碼是打開文件截取一段數據然后播放的,可以輕松的經過加一條線程的方式改成網絡傳輸的形式。
#include "stdafx.h" #include <stdio.h> #include <Windows.h> #pragma comment(lib, "winmm.lib") char buf[1024 * 1024 * 4]; int _tmain(int argc, _TCHAR* argv[]) { FILE* thbgm;//文件 int cnt; HWAVEOUT hwo; WAVEHDR wh; WAVEFORMATEX wfx; HANDLE wait; wfx.wFormatTag = WAVE_FORMAT_PCM;//設置波形聲音的格式 wfx.nChannels = 1;//設置音頻文件的通道數量 wfx.nSamplesPerSec = 8000;//設置每個聲道播放和記錄時的樣本頻率 wfx.nAvgBytesPerSec = 16000;//設置請求的平均數據傳輸率,單位byte/s。這個值對於創建緩沖大小是很有用的 wfx.nBlockAlign = 2;//以字節為單位設置塊對齊 wfx.wBitsPerSample = 16; wfx.cbSize = 0;//額外信息的大小 wait = CreateEvent(NULL, 0, 0, NULL); waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)wait, 0L, CALLBACK_EVENT);//打開一個給定的波形音頻輸出裝置來進行回放 fopen_s(&thbgm, "paomo.pcm", "rb"); cnt = fread(buf, sizeof(char), 1024 * 1024 * 4, thbgm);//讀取文件4M的數據到內存來進行播放,通過這個部分的修改,增加線程可變成網絡音頻數據的實時傳輸。當然如果希望播放完整的音頻文件,也是要在這里稍微改一改 int dolenght = 0; int playsize = 1024; while (cnt) {//這一部分需要特別注意的是在循環回來之后不能花太長的時間去做讀取數據之類的工作,不然在每個循環的間隙會有“噠噠”的噪音 wh.lpData = buf + dolenght; wh.dwBufferLength = playsize; wh.dwFlags = 0L; wh.dwLoops = 1L; waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR));//准備一個波形數據塊用於播放 waveOutWrite(hwo, &wh, sizeof(WAVEHDR));//在音頻媒體中播放第二個函數wh指定的數據 WaitForSingleObject(wait, INFINITE);//用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的INFINITE毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回 dolenght = dolenght + playsize; cnt = cnt - playsize; } waveOutClose(hwo); fclose(thbgm); return 0; }