社区
Delphi
帖子详情
【估计这一帖又要打水漂了】关于多人语音聊天的技术!
clasj
2005-10-24 04:36:55
假如一个语音包里面是60ms的音频数据,打比方说解压后有960Byte的数据量,如果有N(N>=2)个这样的语音包,如何合成成一个960Byte的数据包,而且这个包里面有所有人说话的声音。虽然我说的不是很清楚,但有经验的人一看就会明白的。
你可能感觉我说话的语气很Cool,其实我现在是雪地裸体跪求。。。
...全文
574
56
打赏
收藏
【估计这一帖又要打水漂了】关于多人语音聊天的技术!
假如一个语音包里面是60ms的音频数据,打比方说解压后有960Byte的数据量,如果有N(N>=2)个这样的语音包,如何合成成一个960Byte的数据包,而且这个包里面有所有人说话的声音。虽然我说的不是很清楚,但有经验的人一看就会明白的。 你可能感觉我说话的语气很Cool,其实我现在是雪地裸体跪求。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
56 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
clasj
2005-11-08
打赏
举报
回复
up
clasj
2005-11-07
打赏
举报
回复
楼上大虾如此谦虚,搞的小弟们无地自容啊~~~
belllab
2005-11-07
打赏
举报
回复
我不知道别的,我用Delphi时用过DXMix,可以用来混音,你这个应该能够解决吧?
------------------------------------
我是一个菜鸟,菜菜菜菜菜菜菜菜
clasj
2005-11-07
打赏
举报
回复
up
clasj
2005-11-06
打赏
举报
回复
up
clasj
2005-11-05
打赏
举报
回复
好的,起码我已经有了一个方向!
clasj
2005-11-05
打赏
举报
回复
搞定,详情请见
http://community.csdn.net/Expert/topic/4374/4374115.xml?temp=.278805
欢迎大家光临指导:)
chijingde
2005-11-04
打赏
举报
回复
呵呵
只是知道DirectX Audio能很轻松的实现混音
具体我也没用过
希望能给你点帮助罢了
clasj
2005-11-04
打赏
举报
回复
多谢大虾,我今天眼睛看疼了,明天再试!
chijingde
2005-11-04
打赏
举报
回复
或者这个
DirectX Audio的强大功能
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。
chijingde
2005-11-04
打赏
举报
回复
看看这个是不是你要的
混音(MIXING SOUND)
对DirectSound来说混音是很容易的,它允许你同时播放多个辅助缓冲,它可以自己来完成这些任务。
只要你的程序正确的指定DSBCAPS_STATIC标志,DirectSound就可以最大限度的使用硬件加速,这些标志需要在静态缓冲重新使用时再指定一次。
如果你所有的缓冲都使用同一种声音格式而且硬件输出也是使用这种格式,那么DirectSound的混音将不需要在格式转换上花任何的工夫,从而大到最优的效果(什么都是最优!:P)。
我们可以通过创建一主缓冲或是调用IDirectSoundBuffer::SetFormat方法来改变硬件输出格式,记住这主缓冲仅仅是为控制目的,和写主缓冲是不一样的,而且这种调用必须要DSSCL_PRIORITY(优先级)或更高的级别。
自己的混音
只有在DSSCL_WRITEPRIMARY级别才可以使用自己写的混音部分。在设置了合作级别后,创建主缓冲,然后锁定它,并写数据,再就可以像其它的缓冲一样的来播放了,不过需要设置DSBPLAY_LOOPING标志才可以。
下面就是一个例子:
BOOL AppMixIntoPrimaryBuffer( LPAPPSTREAMINFO lpAppStreamInfo, LPDIRECTSOUNDBUFFER lpDsbPrimary, DWORD dwDataBytes, DWORD dwOldPos, LPDWORD lpdwNewPos)
{
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;
}
种瓜的
2005-11-04
打赏
举报
回复
或许从你这个方案可以延伸到视频会议里面哦!
clasj
2005-11-04
打赏
举报
回复
彻底失败!!!
还是我说的那个问题,是同步播放的,延迟越来越大!!!
没有哪位大虾有解决方案吗?
huanyi
2005-11-04
打赏
举报
回复
up一下,呵呵
clasj
2005-11-04
打赏
举报
回复
麻烦后面进来的朋友帮我顶一下,3Q
clasj
2005-11-04
打赏
举报
回复
up
clasj
2005-11-04
打赏
举报
回复
会是这样吗?
声音进行混音的时候,不就是多个声音文件一块播放的吗?
=============================
你的回答好像让我想起了什么!!!
也许我该去试试!
infuse
2005-11-04
打赏
举报
回复
回复人: clasj(我蛮怀) ( ) 信誉:100 2005-10-27 11:56:59 得分: 0
虽然表面上你有多个线程在播放音频,但是播放设备自动将你的音频数据同步了,也就是说实际上还是一个一个放的,当然,如果你缓冲的音频数据不大的话,是不容易察觉的,这也就是造成你认为“实际运行效果很好”的原因
==========
会是这样吗?
声音进行混音的时候,不就是多个声音文件一块播放的吗?
clasj
2005-11-02
打赏
举报
回复
up
clasj
2005-11-02
打赏
举报
回复
似乎很有道理,但是。。。不会。。。
加载更多回复(36)
一款App的开发成本是多少?
答一: 接触过上万名创业者,开发上线过超过30款App,没有比我更适合回答这个问题的了。。 本文对想做好一款App项目的人来说这是一篇价值百万的回答!因为这是我们花了几百万试错成本试出来的经验! <img src=...
测试dddd
--------------------------------------------------------------如果按一天 5000 营业额来算,也有 500 元,也过得。比方说,你有 10 万元,第一年增值 20%,就变成 12 万,第二年也增值 20%,那可不是 14 万。
开发一个 app 有多难?
大部分人都不想前面投入一半的预付款
打水漂
,而又不知道加这么一个功能到底会加多少钱。这时候已经没法再去选其他的开发商试了。所以会选择做下去。。。 我见过的最常见的例子,就是很
多人
上来就问做一个APP...
【程序人生】我们终将凋零——离开这个人世间——记左耳朵耗子的话和介绍一下 Easegress(全功能型的流量调度和编排系统)
他在自己的播客酷壳里写到:我很幸运出生在这个时代——第三次工业革命的时代,也很幸运选对了专业,所以,可以算是一只“风口上的猪”了,就是运气好,赶上了这个好的时代,我要唯一要做的就是不要辜负这个时代,...
app开发注意事项(外包)
app开发注意事项 在我们从事app开发行业以来每天都会收到大量客户的咨询。其中有创业者,公司的项目经理等等。...◆ 急着想要报价,在自己对需求不确定的时候就要报价。然后就按这个报价开始做。 ◆不知道自己...
Delphi
5,392
社区成员
262,732
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章