求高手指点如何采集声卡输出声音

q12161216 2012-12-26 02:50:25
我在电脑上听歌,想做个程序录制听的歌并用波形显示。录制的声音是通过声卡的输出设备发出的,网上找了好多资料都是对麦克风输入的声音进行录制的,很少有关于声卡输出声音的录制。
求指点,谢谢各位了。。。。
...全文
491 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lpp8866 2012-12-27
  • 打赏
  • 举报
回复
是不是用waveOutOpen()函数来采集扬声器数据?
q12161216 2012-12-27
  • 打赏
  • 举报
回复
跪求大神指点
lpp8866 2012-12-27
  • 打赏
  • 举报
回复
支持,同求,希望哪个大神发功
q12161216 2012-12-26
  • 打赏
  • 举报
回复
高手。。。。上面代码,那块内容是从声卡读取声音的????
潇潇雨云 2012-12-26
  • 打赏
  • 举报
回复
把声音做成文件的 这里写错了 g_WavFmt.nBlockAlign = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / bits; g_WavFmt.nAvgBytesPerSec = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / bits * g_WavFmt.nSamplesPerSec; 改成 g_WavFmt.nBlockAlign = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / 8; g_WavFmt.nAvgBytesPerSec = g_WavFmt.nSamplesPerSec * g_WavFmt.nBlockAlign; 下面是自己的设定 int sps = 44100; // sample per seconds int channels = 2; //numbers of channels int bits = 16; //Bit rate int wav_length_sec = 30; //Rec length (sec)
潇潇雨云 2012-12-26
  • 打赏
  • 举报
回复
// consolea.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <windows.h> #include <aviriff.h> #include <iostream> using namespace std; //WAV format def int sps = 44100; // sample per seconds int channels = 1; //numbers of channels int bits = 8; //Bit rate. Why does it not works with 16? int wav_length_sec = 30; //Rec length (sec) int WAVBUFFERLENGTH(channels * bits * sps/8 * wav_length_sec); WAVEFORMATEX g_WavFmt = {0}; //Wave header length int HEADERLENGTH (sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + sizeof(WAVEFORMATEX) + sizeof(RIFFCHUNK)); void InitWavFmt(void) { g_WavFmt.wFormatTag = WAVE_FORMAT_PCM; g_WavFmt.nChannels = channels; g_WavFmt.nSamplesPerSec = sps; g_WavFmt.wBitsPerSample = bits; g_WavFmt.nBlockAlign = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / bits; g_WavFmt.nAvgBytesPerSec = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / bits * g_WavFmt.nSamplesPerSec; g_WavFmt.cbSize = 0; } char* AddWavHdr(char *pinBuffer, int inWavLength) { BYTE *pWavHdr = NULL; RIFFLIST *pRiffWave = NULL; RIFFCHUNK *pRiffFmt = NULL; RIFFCHUNK *pRiffData = NULL; char* outWavBuffer = NULL; if (NULL == pinBuffer) { return NULL; } pWavHdr = new BYTE[HEADERLENGTH]; if ( NULL == pWavHdr) { return NULL; } else { memset(pWavHdr, 0, sizeof(BYTE) * HEADERLENGTH); } pRiffWave = (RIFFLIST*)pWavHdr; pRiffFmt = (RIFFCHUNK*)(pRiffWave + 1); pRiffData = (RIFFCHUNK*)(((BYTE*)(pRiffFmt + 1)) + sizeof(WAVEFORMATEX)); pRiffWave->fcc = FCC('RIFF'); pRiffWave->cb = inWavLength + HEADERLENGTH - sizeof(RIFFCHUNK); pRiffWave->fccListType = FCC('WAVE'); pRiffFmt->fcc = FCC('fmt '); pRiffFmt->cb = sizeof(WAVEFORMATEX); pRiffData->fcc = FCC('data'); pRiffData->cb = inWavLength; memcpy(pRiffFmt + 1, &g_WavFmt, pRiffFmt->cb); outWavBuffer = (char*)new BYTE[inWavLength+HEADERLENGTH]; if (NULL == outWavBuffer) { return NULL; } else { memset(outWavBuffer, 0, sizeof(BYTE) * (inWavLength + HEADERLENGTH)); } memcpy(outWavBuffer, pWavHdr, sizeof(BYTE) * HEADERLENGTH); memcpy(outWavBuffer + HEADERLENGTH, pinBuffer, (sizeof(BYTE) * inWavLength)); return outWavBuffer; } void main () { HWAVEIN hWavIn; WAVEHDR WavHdr; char *pBuffer = NULL; char *pWavBuffer = NULL; MMRESULT ret; FILE *fpPCMFile; FILE *fpWavFile; MMTIME MMTime = {0}; unsigned int numwritten = 0; MMTime.wType = TIME_BYTES; InitWavFmt(); cout << "NumDev = " << waveInGetNumDevs() << endl; if (0 == waveInGetNumDevs()) { cout << "Audio device not found!\n"; exit(0); } ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0, 0, WAVE_FORMAT_QUERY); if (MMSYSERR_NOERROR != ret) { cout << "Unsupported WAV format.\n"; exit(0); } ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0, 0, CALLBACK_NULL); if (MMSYSERR_NOERROR != ret) { exit(0); } pBuffer = (char*)malloc(WAVBUFFERLENGTH); if ( NULL != pBuffer) { memset(pBuffer, 0, WAVBUFFERLENGTH); } else { exit(0); } WavHdr.lpData = pBuffer; WavHdr.dwBufferLength = WAVBUFFERLENGTH; WavHdr.dwBytesRecorded = 0; WavHdr.dwUser = 0; WavHdr.dwFlags = 0; WavHdr.dwLoops = 1; WavHdr.lpNext = 0; WavHdr.reserved = 0; ret = waveInPrepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR)); if (MMSYSERR_NOERROR != ret) { free(pBuffer); exit(0); } ret = waveInAddBuffer(hWavIn, &WavHdr, sizeof(WAVEHDR)); if (MMSYSERR_NOERROR != ret) { free(pBuffer); exit(0); cout <<"Press any key to start recording...\n"; _getch(); cout << "Recording now\n"; ret = waveInStart(hWavIn); if (MMSYSERR_NOERROR != ret) { free(pBuffer); exit(0); } cout << "Press any key to stop Recording\n"; _getch(); waveInGetPosition(hWavIn, &MMTime, sizeof(MMTime)); waveInReset(hWavIn); cout << "sizeof MMTime = " << sizeof(MMTime) << endl; waveInUnprepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR)); waveInClose(hWavIn); fpPCMFile = fopen("pcm","w"); if (NULL == fpPCMFile) { cout <<"Creating PCM file failed\n"; free(pBuffer); exit(0); } numwritten = fwrite(pBuffer, sizeof(char), MMTime.u.cb, fpPCMFile); cout <<"Recording done, %d bytes recorded, %d bytes written: " << MMTime.u.cb << endl << " numwritten: " << numwritten; fclose(fpPCMFile); pWavBuffer = AddWavHdr(pBuffer, MMTime.u.cb); if ( NULL == pWavBuffer) { cout <<"Add header failed\n"; } else { fpWavFile = fopen("testfil.wav", "w"); if (NULL == fpWavFile) { cout <<"Creating WAV file failed\n"; } else { numwritten = fwrite(pWavBuffer, sizeof(char), sizeof(BYTE) * (HEADERLENGTH + MMTime.u.cb), fpWavFile); cout <<"%d bytes of WAV file written\n", numwritten; fclose(fpWavFile); free(pWavBuffer); } } free(pBuffer); _getch(); return; } }
q12161216 2012-12-26
  • 打赏
  • 举报
回复
求大神指教。。。。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧