社区
网络编程
帖子详情
求高手指点如何采集声卡输出声音
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
打赏
举报
回复
求大神指教。。。。。
Linux
声卡
驱动程序
3期的
声卡
驱动更详细,推荐。
如何让RedFlag出声?
这两天晚上都比较安静,因为昨天我在电脑上装了个RedFlag,但是
声卡
却怎么也装不好,我对linux不熟悉,折腾了几次都搞不定。不过这样也好,正好让耳根清静一下,好好地思考思考人生…… 记得最开始接触电脑是在学校...
为什么会出现蓝屏,而且每次的代码都不一样?
我们公司有30多台电脑,...请
高手
指点
! 都是新机,还有,不是液晶显示器的就不会出现这种问题,那些蓝屏的机器配置都一样,系统是XP的, 解决方法: 你看看是什么程序导致的蓝屏,我估计蓝屏是软件引起的,实在不行的话
码农录歌心得
码农录歌心得 这事写这里不知道会不会被打~ ...最近喜欢上录歌,不是自己写歌编曲演奏演唱那么高段,也不是自弹自唱(这个...
输出
。陆续录了一些,算是有了一些心得,分享一下。纯业余+新手向,恳请指...
电子工程师比掌握的知识
3) 开关量
输出
信号调理:6个固态继电器和8个继电器,可以被任何一路信号控制和驱动,接口:固态继电器5.08直立,继电器3.81直立 4) 开关量输入调理:干接点闭合为1或0可选,接口:3.81直立 5) RS232调理: 1. ...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章