假如一个语音包里面是60ms的音频数据,打比方说解压后有960Byte的数据量,如果有N(N>=2)个这样的语音包,如何合成成一个960Byte的数据包,而且这个包里面有所有人说话的声音。虽然我说的不是很清楚,但有经验的人一看就会明白的。你可能感觉我说话的语气很Cool,其实我现在是雪地裸体跪求

解决方案 »

  1.   

    一起播放是有问题的!!!
    比如说你同时收到了N(N>=2)个60ms的音频数据包,如果你将这N个音频包都播放出来你实际播放的时间是N*60ms,而不是60ms。大家应该懂我的意思吧。
      

  2.   

    eastnofail = 东方不败?I 服了 YOU!
      

  3.   

    如果是wav格式的,应该能够实现
      

  4.   

    http://www.china-askpro.com/msg13/qa20.shtml
      

  5.   

    thaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanks!
      

  6.   

    嗯。
    这就是所谓的边带技术。
    每一路单独录音、压缩、发送的话,数据量大,延时长,而且会有同步的问题。
    因为人语音的频率范围是比较窄的,在3~4KHz以内,
    所以把不同人的语音变频到不同范围,一起压缩、发送。
    可以减少数据量和延迟时间。
      

  7.   

    回复人: clasj(我蛮怀) ( ) 信誉:100  2005-10-27 11:56:59  得分: 0  
     
     
       
    虽然表面上你有多个线程在播放音频,但是播放设备自动将你的音频数据同步了,也就是说实际上还是一个一个放的,当然,如果你缓冲的音频数据不大的话,是不容易察觉的,这也就是造成你认为“实际运行效果很好”的原因  
    ==========
    会是这样吗?
    声音进行混音的时候,不就是多个声音文件一块播放的吗?
     
      

  8.   

    看看这个是不是你要的混音(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;
    }
      

  9.   

    或者这个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。 
      

  10.   

    呵呵只是知道DirectX Audio能很轻松的实现混音具体我也没用过希望能给你点帮助罢了
      

  11.   

    搞定,详情请见
    http://community.csdn.net/Expert/topic/4374/4374115.xml?temp=.278805
    欢迎大家光临指导:)
      

  12.   

    我不知道别的,我用Delphi时用过DXMix,可以用来混音,你这个应该能够解决吧?------------------------------------
    我是一个菜鸟,菜菜菜菜菜菜菜菜