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

FadingSoundInput-Output分享

时间:2023-04-11 11:32:03 C#

FadingSoundInput/Output我有一个无限循环播放的背景音。我希望它在用户按下按钮时淡出。我尝试了以下方法:问题:有人知道更好的解决方案吗?要执行平滑的淡入或淡出,您需要在样本级别进行。然后将每个样本乘以逐渐增加或减少的数字。您正在使用WaveChannel32,因此您的音频已转换为32位浮点数。然后我将创建另一个IWaveProvider实现器来处理淡入淡出。通常它会通过样本不变,但在Read方法中,如果你在或不在(或者如果它是立体声,则正确),它会乘以每个样本。NAudio1.5中的ISampleProvider接口旨在使这类事情变得更容易,因为它允许您将样本作为32位浮点数处理,而不是实现需要您从byte[]转换为float[]的IWaveProvider。这是我刚刚制作的淡入和淡出的SampleProvider,我将把它包含在下一个NAudio中,并希望尽快在博客中介绍它。只需使用适当的淡入淡出持续时间调用BeginFadeIn或BeginFadeOut。公共类FadeInOutSampleProvider:ISampleProvider{enumFadeState{Silence,FadingIn,FullVolume,FadingOut,}privatereadonlyobjectlockObject=newobject();私有只读ISampleProvider源;私有intfadeSamplePosition;私有intfadeSampleCount;私有淡入淡出状态;publicFadeInOutSampleProvider(ISampleProvidersource){this.source=source;this.fadeState=FadeState.FullVolume;}publicvoidBeginFadeIn(doublefadeDurationInMilliseconds){lock(lockObject){fadeSamplePosition=0;fadeSampleCount=(int)((fadeDurationInMilliseconds*source.WaveFormat.SampleRate)/1000);fadeState=FadeState.FadingIn;}}publicvoidBeginFadeOut(doublefadeDurationInMilliseconds){lock(lockObject){fadeSamplePosition=0;fadeSampleCount=(int)((fadeDurationInMilliseconds*source.WaveFormat.SampleRate)/1000);fadeState=FadeState.FadingOut;}}publicintRead(float[]buffer,intoffset,intcount){intsourceSamplesRead=source.Read(缓冲区,偏移量,计数);锁(lockObject){if(fadeState==FadeState.FadingIn){FadeIn(buffer,offset,sourceSamplesRead);}elseif(fadeState==FadeState.FadingOut){FadeOut(buffer,offset,sourceSamplesRead);}elseif(fadeState==FadeState.Silence){ClearBuffer(buffer,offset,count);}}返回sourceSamplesRead;}privatestaticvoidClearBuffer(float[]buffer,intoffset,intcount){for(intn=0;nfadeSampleCount){fadeState=FadeState.Silence;//清除结尾ClearBuffer(buffer,sample+offset,sourceSamplesRead-sample);休息;}}}privatevoidFadeIn(float[]buffer,intoffset,intsourceSamplesRead){intsample=0;while(samplefadeSampleCount){fadeState=FadeState.FullVolume;//不需要再乘法break;}}}publicWaveFormatWaveFormat{get{returnsource.WaveFormat;}}}或者你可以这样做:while(waveOut.volume>0.1){waveOut.volume-=0.1;系统.Threading.Thread.Sl伊普(10);}^一个淡出的例子我在我自己的程序中使用它并且它工作正常。以上就是C#学习教程:fadingsoundinput/output分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢