假如一个语音包里面是60ms的音频数据,打比方说解压后有960Byte的数据量,如果有N(N>=2)个这样的语音包,如何合成成一个960Byte的数据包,而且这个包里面有所有人说话的声音。虽然我说的不是很清楚,但有经验的人一看就会明白的。你可能感觉我说话的语气很Cool,其实我现在是雪地裸体跪求
解决方案 »
- 如何给分配的内存赋值?
- 如何使电脑屏幕不显示时间栏
- 请指教??
- 一则笑话
- 我们都是从学生过来的,不知各位怎么看?<<新生拒绝勒索被打死续:校方百般推卸责任>>
- 讨论一个有点难度和实际的问题:怎样用数据字典描述表间关系,路过请进
- sql 表中默认的空值是<null> select * frome table where note=null 不行,该怎么办呢〉?
- sql语句删除!
- 如何修改vcl的源文件!紧急求助!
- 请问如何把一个已知表的结构复制生成另一个表的结构?
- 为什么DELPHI5里用IdFTP1.TransferType:=ftAscii;编译不能通过,提示没定义ftAscii
- 关于程序发布和更新问题
比如说你同时收到了N(N>=2)个60ms的音频数据包,如果你将这N个音频包都播放出来你实际播放的时间是N*60ms,而不是60ms。大家应该懂我的意思吧。
这就是所谓的边带技术。
每一路单独录音、压缩、发送的话,数据量大,延时长,而且会有同步的问题。
因为人语音的频率范围是比较窄的,在3~4KHz以内,
所以把不同人的语音变频到不同范围,一起压缩、发送。
可以减少数据量和延迟时间。
虽然表面上你有多个线程在播放音频,但是播放设备自动将你的音频数据同步了,也就是说实际上还是一个一个放的,当然,如果你缓冲的音频数据不大的话,是不容易察觉的,这也就是造成你认为“实际运行效果很好”的原因
==========
会是这样吗?
声音进行混音的时候,不就是多个声音文件一块播放的吗?
{
LPVOID lpvPtr1;
DWORD dwBytes1;
LPVOID lpvPtr2;
DWORD dwBytes2;
HRESULT hr; //锁定缓冲
hr = lpDsbPrimary->lpVtbl->Lock(lpDsbPrimary, dwOldPos, dwDataBytes, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0); //如果返回DSERR_BUFFERLOST,还原DS并从新锁定
if (DSERR_BUFFERLOST == hr)
{
lpDsbPrimary->lpVtbl->Restore(lpDsbPrimary);
hr = lpDsbPrimary->lpVtbl->Lock(lpDsbPrimary, dwOldPos, dwDataBytes, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0);
} if SUCCEEDED(hr)
{
//将混音的数据送到缓冲区内
CustomMixer(lpAppStreamInfo, lpvPtr1, dwBytes1);
//该函数负责混合若干数据流。下同
*lpdwNewPos = dwOldPos + dwBytes1;
if (NULL != lpvPtr2)
{
CustomMixer(lpAppStreamInfo, lpvPtr2, dwBytes2);
*lpdwNewPos = dwBytes2;
} //解锁
hr = lpDsbPrimary->lpVtbl->Unlock(lpDsbPrimary, lpvPtr1, dwBytes1, lpvPtr2, dwBytes2); if SUCCEEDED(hr)
{
return TRUE;
}
} //锁定或解锁失败
return FALSE;
}
DirectX Audio做的不仅仅只是简单地对声音的回放。它提供了一个完整的系统,能够利用硬件加速的功能动态地操纵控制音轨和声道(soundtrack)。 如果你想在你的程序中使用DirectMusic和DirectSound,你就能够获得以下功能: l 读入且播放例如MIDI, WAVE, 以及DirectMusic Producer run time等格式的声音文件。 l 同时对多个声音资源进行混音播放。 l 对播放的声轨进行高精度时间控制。 l 可以动态地变更播放节拍与节奏,甚至即时地动态控制一些MIDI事件。 l 使用DLS合成器(DAudio自带的波表合成器),你的程序就可以确保在不同的计算机上听到相同的MIDI声音。你的 程序能够播放不受类别限制,各试各样乐器的声音,使用DAudio,你甚至还能够创造出独一无二的乐器声音类别并将它发布。 l 把声音做3D定位,创造出3D的环境声响。 l 可以非常容易地实现例如变调,回响,以及别的声音特效。 l 能使用数量超过16个的MIDI音轨。DirectAudio突破了从前只能使用16个MIDI音轨的限制,它把同时回放大数量的音轨变成为了可能,而这个数量仅仅只是受到了你的声音硬件合成器能力的限制。 l 播放位于不同的Audiopaths(可以通过各种方式管理声音数据)上播放声音段(segments),效果就可以独各实现在每一段声音里。 l 实现在不同的端口(port)之间捕捉MIDI数据及流("thru")。 l 从话筒或者别的输入设备中捕捉声音数据。 如果使用DirectMusic Producer或类似程序中的源文件,你还能够做到: l 在声音的回放期间能够做更多的控制,例如动态选择不同的音效变化器(variations)或切换不同的和旋级数。 l 精确地定时重放音乐。 l 利用变化器(variations)播放声音(wave) l Audiopaths利用Map performance channels可以使相同的声音段(segment)在channel的不同部分产生完全不同的播放效果。 l 动态地创造出全新的音乐片段,这不需要专门算法库而仅仅需要你的作曲能力。 l 动态地将存在的音乐片段进行组合过渡。 l 在声音回放时端,程序可以获得存在于特殊节拍点的各类声音特效的信息。 这些功能适用于常常只使用主声音流(mainstream)的程序。如果程序只要实现一些基本简单的功能,开发者将DirectX Audio设计得非常方便使用,它对于一些想入门的程序员显得非常友好。DirectX Audio也是可扩展的。好的程式可以利用虚函数(virtual)继承设计出新的类,例如: l 支持新的声音格式文件。 l 音轨可以包含各类数据。 l 处理信息的工具 - 比方说,可以截取记录实现变换,或者将要显示的歌词置入声音片段(segment)文件。 l 自定义的音序器(sequencer)。 l 自定义的合成器(synthesizer)。 l 效果过滤器。(Effects filters)。 DirectX Audio的每一个部件都是DirectMusic Producer,我们可以采集DLS,和旋图(chordmaps),风格(styles),以及片段(segments) -- 让你能够充分地利用DirectMusic强大的功能与优势。DirectMusic Producer 甚至也能够实现创建可播放的包含多节拍声音的片段(segments)。这里所指的声音是可以在播放时段(run time)以压缩格式存在与播放流中或者内存中。 DirectX Audio 被 Microsoft Windows95, Microsoft Windows98, Microsoft Windows2000所支持。只是对硬件波表合成器的支持只有 Windows 2000 和 Windows 98 Second Edition。
http://community.csdn.net/Expert/topic/4374/4374115.xml?temp=.278805
欢迎大家光临指导:)
我是一个菜鸟,菜菜菜菜菜菜菜菜