当前位置: 首页 > 编程语言 > C#

从Windows8应用程序生成的缓冲区播放声音

时间:2023-04-10 11:47:19 C#

从Windows8应用程序生成的缓冲区播放声音从缓冲区。在最简单的情况下,我只是创建一个具有所需持续时间和频率的正弦波。持续时间和频率都可以有很大差异,所以我宁愿不依赖MediaElements(除非有某种方法可以更改基本文件的频率,但这只会帮助我生成单一频率)。WinRT中XNASoundEffectInstance的等价物是什么?我假设我需要使用DirectX,但我不确定如何从其他C#/XAML应用程序执行此操作。我看过SharpDX,但它似乎没有我认为需要使用的DirectSound、SecondaryBuffer、SecondaryBuffer类。我在上面做了一些假设。也许我正在寻找错误的类,或者有一种完全独立的方式可以从Windows8应用程序生成任意声音。我找到了一个使用SharpDX的XAudio2通过AudioBuffer播放wav文件的示例。这看起来很有希望,我只需要用本机文件流替换生成的音频缓冲区。PM>安装包SharpDXPM>安装包SharpDX.XAudio2publicvoidPlaySound(){XAudio2xaudio;MasteringVoice掌握声音;xaudio=newXAudio2();masteringVoice=newMasteringVoice(xaudio);varnativefilestream=newNativeFileStream(@"On.AssetsSpeechwav",NativeFileMode.Open,NativeFileAccess.Read,NativeFileShare.Read);varsoundstream=newSoundStream(nativefilestream);varwaveFormat=soundstream.Format;varbuffer=newAudioBuffer{Stream=soundstream.ToDataStream(),AudioBytes=(int)soundstream.Length,Flags=BufferFlags.EndOfStream};varsourceVoice=newSourceVoice(xaudio,waveFormat,true);//也支持改变频率。sourceVoice.SetFrequencyRatio(0.5f);sourceVoice.SubmitSourceBuffer(缓冲区,soundstream.DecodedPacketsInfo);sourceVoice.Start();}在Win8RT中生成动态声音的唯一方法是使用XAudio2,因此您应该能够使用SharpDX.XAudio2执行此操作。不使用NativeFileStream,只需实例化一个直接给定托管缓冲区的DataStream(或者您可以使用非托管缓冲区或让DataStream为您实例化一个)。代码如下://初始化阶段,在应用程序的生命周期中保留此缓冲区//在44.1Khz的立体声16位信号中分配10svarmyBufferOfSamples=newshort[44100*10*2];//创建一个带有固定托管缓冲区的DataStreamvardataStream=DataStream.Create(myBufferOfSamples,true,true);varbuffer=newAudioBuffer{Stream=dataStream,AudioBytes=(int)dataStream.Length,Flags=BufferFlags.EndOfStream};//...//填充myBufferOfSamples//...//PCM44.1Khz立体声16位格式varwaveFormat=newWaveFormat();XAudio2xaudio=newXAudio2();MasteringVoicemasteringVoice=newMasteringVoice(xaudio);varsourceVoice=newSourceVoice(xaudio,waveFormat,true);//提交缓冲区sourceVoice.SubmitSourceBuffer(buffer,null);//开始播放sourceVoice.Start();使用正带波填充填充冲区的示例方法:privatevoidFillBuffer(short[]buffer,intsampleRate,doublefrequency){doubletotalTime=0;对于(inti=0;i>8);总时间+=2;}}您也可以使用WASAPI在WinRT中播放动态生成的声音缓冲区(xaudio2不是唯一的解决方案)。我在这里用VB编写示例代码(C#基本相同):http://www.codeproject.com/Articles/460145/Recording-and-playing-PCM-audio-on-Windows-8-VB我相信NAudioGuys正计划将我的示例代码翻译成NAudio,以获得更易于使用的Win8支持版本。以上就是《C#学习教程:从Windows8应用程序生成的缓冲区中播放声音》的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: