社区
网络编程
帖子详情
求高手指点如何采集声卡输出声音
q12161216
2012-12-26 02:50:25
我在电脑上听歌,想做个程序录制听的歌并用波形显示。录制的声音是通过声卡的输出设备发出的,网上找了好多资料都是对麦克风输入的声音进行录制的,很少有关于声卡输出声音的录制。
求指点,谢谢各位了。。。。
...全文
503
7
打赏
收藏
求高手指点如何采集声卡输出声音
我在电脑上听歌,想做个程序录制听的歌并用波形显示。录制的声音是通过声卡的输出设备发出的,网上找了好多资料都是对麦克风输入的声音进行录制的,很少有关于声卡输出声音的录制。 求指点,谢谢各位了。。。。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
求大神指教。。。。。
如何让RedFlag出声?
这两天晚上都比较安静,因为昨天我在电脑上装了个RedFlag,但是
声卡
却怎么也装不好,我对linux不熟悉,折腾了几次都搞不定。不过这样也好,正好让耳根清静一下,好好地思考思考人生…… 记得最开始接触电脑是在学校,那时候电脑可是个宝贝东西,空调是必须的装备,进机房都得换鞋。电脑好像是绿色屏幕的苹果机,运行的是DOS操作系统,这个印象觉得有些奇怪,但记忆确实是这样的。先学的编程语言是basic,做...
为什么会出现蓝屏,而且每次的代码都不一样?
我们公司有30多台电脑,都是三星液晶的显示器,才装好不久,就经常出现蓝屏,为什么会出现蓝屏,而且每次的代码都不一样?怎么样解决?或者说蓝屏出现的常见问题,我也不知道怎么说,就是说有没有同一个故障会出现各种蓝屏的错误?请
高手
指点
! 都是新机,还有,不是液晶显示器的就不会出现这种问题,那些蓝屏的机器配置都一样,系统是XP的, 解决方法: 你看看是什么程序导致的蓝屏,我估计蓝屏是软件引起的,实在不行的话
电子工程师比掌握的知识
愚以为,掌握了一下的硬件和软件知识,基本上就可以成为一个合格的电子工程师: 第一部分:硬件知识 一、 数字信号 1、 TTL和带缓冲的TTL信号 2、 RS232和定义 3、 RS485/422(平衡信号) 4、 干接点信号 二、 模拟信号视频 1、 非平衡信号 2、 平衡信号 三、 芯片 1、 封装 2、 7407 3、 7404 4、 7400 5、 74LS57
码农录歌心得
码农录歌心得 这事写这里不知道会不会被打~ 最近喜欢上录歌,不是自己写歌编曲演奏演唱那么高段,也不是自弹自唱(这个后面可以有),也不是去录音棚交钱只管唱那么悠然。就是在自己的电脑上,翻唱一些自己喜欢的歌,自娱自乐一下。所以要做的事无非是:找伴奏+录唱+后期混缩=>
输出
。陆续录了一些,算是有了一些心得,分享一下。纯业余+新手向,恳请指...
高手
经验之---谈51单片机/从51初学者到电子工程师
从 51 初学者到电子工程师 SBL 整理 简介:从 51 初学者到电子工程师 1 关键字:单片机 从 51 初学者到电子工程师 1 从初学者到电子工程师 一、前言 很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养家糊口、慢慢小 有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面掌握这些知识,因为这些行业用不上, 例如,液晶显示器,很多行业就不需要
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章