有没有朋友做C++音频压缩编码的朋友。请教点问题。

quguoping1017 2008-12-29 11:08:25
以一种音频格式为例,计算机采集并存储双通道的音频数据流程是什么?
音频质量和哪些音频参数有关,怎样用一段程序验证呢?有没有高手指导一下。非常感谢,课程学习哦。
...全文
357 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
YY_006 2010-06-28
  • 打赏
  • 举报
回复
看不懂啊。。。。。。。。。。。。。。。
kohoko 2010-06-28
  • 打赏
  • 举报
回复
啊~~~~~~~~~~~·看不懂啊。。。。。。。。。。。。。。。
startstartsvip 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ckt1120 的回复:]
计算机采集并存储双通道的音频数据流程是什么
------------
在内存中存储顺序:点1(左通道,右通道), 点2(左通道,右通道), ....

音频质量和哪些音频参数有关
------------
采样率:一般而言,越高音质越好,一般为8000,
压缩比:不同的算法压缩的不同,一般的,压缩比越高,音频文件越小,而音质也比较差


一段程序验证
-----------
验证语音的话,自己用cool eidt去录制看看就知道了
[/Quote]

这家伙很懂!
瓶盒 2008-12-30
  • 打赏
  • 举报
回复
前不久做了个类似的,你可以参考一下。
http://download.csdn.net/source/800786
roadblossom 2008-12-30
  • 打赏
  • 举报
回复
good ! 学习学习! :D
lin12345 2008-12-30
  • 打赏
  • 举报
回复
顶一下,顺便学习一下
quguoping1017 2008-12-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bottlebox 的回复:]
前不久做了个类似的,你可以参考一下。
http://download.csdn.net/source/800786
[/Quote]
大哥你程序有错,也放到CSDN里给别人下啊。
quguoping1017 2008-12-30
  • 打赏
  • 举报
回复
计算机采集并存储双通道的音频数据的具体流程。有朋友详细介绍一下吗?
herman~~ 2008-12-30
  • 打赏
  • 举报
回复
质量跟采用的频率有关系的吧
ckt 2008-12-29
  • 打赏
  • 举报
回复
如何采集?
-----------
不知道,看你用什么东西去采集语音了


存储能不能详细点?
------------
内存中的存储顺序是那样,
不知道你是要做什么用,如果是要了解这个自己去写解压算法的话不如网上找源码


参数还有别的吗
---------
你可以查看下WAVEFORMATEX这个结构


录制是什么意思啊
---------
cool eidt 可以录制语音,不知道么?
quguoping1017 2008-12-29
  • 打赏
  • 举报
回复
还有没有高手来看看。帮忙解决一下哦。感激不尽
quguoping1017 2008-12-29
  • 打赏
  • 举报
回复
如何采集? 存储能不能详细点? 参数还有别的吗 ?最后录制是什么意思啊
ckt 2008-12-29
  • 打赏
  • 举报
回复
计算机采集并存储双通道的音频数据流程是什么
------------
在内存中存储顺序:点1(左通道,右通道), 点2(左通道,右通道), ....

音频质量和哪些音频参数有关
------------
采样率:一般而言,越高音质越好,一般为8000,
压缩比:不同的算法压缩的不同,一般的,压缩比越高,音频文件越小,而音质也比较差


一段程序验证
-----------
验证语音的话,自己用cool eidt去录制看看就知道了
ysysbaobei 2008-12-29
  • 打赏
  • 举报
回复
帮你顶上去,高手来解决
nullah 2008-12-29
  • 打赏
  • 举报
回复
帮顶~~~~
quguoping1017 2008-12-29
  • 打赏
  • 举报
回复
求学不才,请高人指点啊。
quguoping1017 2008-12-29
  • 打赏
  • 举报
回复
WIN32音频数据采集 WaveIn-Out实现

基本步骤及思想:设定音频采集参数(采样率、声道等),打开音频设备和开辟缓存,操作采集的数据。
1. 定义音频采集参数

WAVEFORMATEX waveform;//WAVE波形的采集参数

typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;


waveform.wFormatTag=WAVE_FORMAT_PCM;

waveform.nChannels=1; //声道设为1

waveform.nSamplesPerSec=11025; //采样率11025

waveform.nAvgBytesPerSec=11025;

waveform.nBlockAlign=1;

waveform.wBitsPerSample=8; //数据位设为8位

waveform.cbSize=0;



PWAVEHDR pWaveHdr1,pWaveHdr2; //WAVE波形的头信息



2. 打开音频采集设备并开辟缓存

if (waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW)) { //打开设备

free(pBuffer1);

free(pBuffer2);

MessageBeep(MB_ICONEXCLAMATION);

AfxMessageBox("Audio can not be open!");

}

pWaveHdr1->lpData=(LPTSTR)pBuffer1;

pWaveHdr1->dwBufferLength=INP_BUFFER_SIZE;

pWaveHdr1->dwBytesRecorded=0;

pWaveHdr1->dwUser=0;

pWaveHdr1->dwFlags=0;

pWaveHdr1->dwLoops=1;

pWaveHdr1->lpNext=NULL;

pWaveHdr1->reserved=0;


waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));


pWaveHdr2->lpData=(LPTSTR)pBuffer2;

pWaveHdr2->dwBufferLength=INP_BUFFER_SIZE;

pWaveHdr2->dwBytesRecorded=0;

pWaveHdr2->dwUser=0;

pWaveHdr2->dwFlags=0;

pWaveHdr2->dwLoops=1;

pWaveHdr2->lpNext=NULL;

pWaveHdr2->reserved=0;


waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));


//////////////////////////////////////////////////////////////////////////

pSaveBuffer = (PBYTE)realloc (pSaveBuffer, 1) ;

// Add the buffers


waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;

waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;



3. 操作采集的音频数据

在WAVEIN中有如下几个消息

MM_WOM_OPEN //设备的打开

MM_WIM_DATA //设备数据的采集及操作

MM_WIM_CLOSE //设备的关闭



void CRecordHWndDlg::OnMM_WIM_DATA(UINT wParam, LONG lParam)

{

// TODO: Add your message handler code here and/or call default

// Reallocate save buffer memory


//////////////////////////////////////////////////////////////////////////


pNewBuffer = (PBYTE)realloc (pSaveBuffer, dwDataLength +

((PWAVEHDR) lParam)->dwBytesRecorded) ;


if (pNewBuffer == NULL)

{

waveInClose (hWaveIn) ;

MessageBeep (MB_ICONEXCLAMATION) ;

AfxMessageBox("erro memory");

return ;

}
pSaveBuffer = pNewBuffer ;

//////////////////////////////////////////////////////////////////////////


CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData,

((PWAVEHDR) lParam)->dwBytesRecorded) ;


dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ;


if (bEnding)

{

waveInClose (hWaveIn) ;

return ;

}

CFile file;

file.Open("data.txt",CFile::modeWrite|CFile::modeCreate);

file.Write(pSaveBuffer,dwDataLength);

file.Close();

// Send out a new buffer

waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;

TRACE("done input data\n");

return ;

}



看看你能不能把他还原成一个完整的可执行代码
wesleyluo 2008-12-29
  • 打赏
  • 举报
回复
唉,我从c++ builder那边找过来的,原来你也在找。
我找的资料,就下面这篇还详细点,给你看了:
实时录音并显示波形、频谱

本文讲述如何实时录音,以及将录音波形频谱实时显示的方法。Windows提供了一个多媒体控制接口(MCI),用它可以录音,很方便。但是这种方法不能实时给出录音的原始数据,因此要显示波形和频谱都是不可能实现的。要达到实时的效果,就要使用Windows提供的另一套函数,即低级音频函数。其中和录音有关的是以waveIn开头的一组函数。

低级音频函数的使用比较繁琐,大致要有以下几个步骤。

用waveInOpen打开设备,并设置回调。因为要保证实时性,所以不能用查询的方式,而必须设置回调。
为设备分配足够的内存做缓冲区,动态分配或静态数组都可以。为了保证实时性,程序用了双缓冲技术,在处理一个缓冲区数据的同时另一个缓冲区用于录音。为了便于说明写成Buffer1、Buffer2。
将Buffer1关联到设备上去,waveInPrepareBuffer、waveInAddBuffer。
开始录音,waveInStart
当驱动程序填满这个缓冲区(Buffer1)时就会产生回调(消息为WIM_DATA),这时立刻将Buffer2关联到设备上继续录音,然后处理Buffer1,当驱动程序填满Buffer2时又会产生回调,这是再将Buffer1关联到设备上,而去处理Buffer2,如此反复就使得录音能够实时的进行下去。
停止录音,waveInStop
关闭设备,waveInClose
上面就是实时录音的一个基本流程,产生回调时,其lParam就是一个指向WAVEHDR结构的指针,通过这个指针就可以得到原始数据(注意了:我这个程序只是单声道8位的PCM格式,因此正好一个字节就是一个采样点的值,对于其他格式的我就不知道了)。有了原始数据就可以很容易的画出波形了,而频谱也就是多一次FFT变换而已,没什么太难的。

链接http://vip.6to23.com/NowCan1/tech/snd_wave.htm
自己去下源程序。
ckt 2008-12-29
  • 打赏
  • 举报
回复
我不是做专门做这块的,只是接触过一点语音处理,mpeg没做过

等高手了哈
quguoping1017 2008-12-29
  • 打赏
  • 举报
回复
msdn查了,英文有些没能理解。资料找了很多,都不太靠谱。

以mepg音频格式为例,计算机是怎样对其采集并存储双通道音频数据的 完整流程。

写一段音频程序,读一个音频文件,测试哪些参数会影响音频质量。

挺难的课题,你是做音视频解码的吗?能不能提供点帮助啊。
加载更多回复(3)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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