我想播放铃声警报而不加载/从文件中流式播放。
我可以在代码中嵌入它的信号或音调吗?我正在使用NAudio
。
我的目的是通过删除IO操作来提高性能。
我不想使用嵌入式资源。 只有我想在代码中生成铃声警报。
答案 0 :(得分:3)
使用NAudio,您可以选择这样做:
System.Media.SoundPlayer
已经足够了。play
美好时光所做的那样。)第一个案例的示例来自MSDN上的Charles Petzold文章(但也请查看NAudio documentation):
class SineWaveOscillator : WaveProvider16 {
double phaseAngle;
public SineWaveOscillator(int sampleRate):
base(sampleRate, 1) {
}
public double Frequency { set; get; }
public short Amplitude { set; get; }
public override int Read(short[] buffer, int offset,
int sampleCount) {
for (int index = 0; index < sampleCount; index++) {
buffer[offset + index] =
(short)(Amplitude * Math.Sin(phaseAngle));
phaseAngle +=
2 * Math.PI * Frequency / WaveFormat.SampleRate;
if (phaseAngle > 2 * Math.PI)
phaseAngle -= 2 * Math.PI;
}
return sampleCount;
}
}
然后播放音调的代码很简单:
SineWaveOscillator osc = new SineWaveOscillator(44100);
osc.Frequency = 440;
osc.Amplitude = 8192;
WaveOut waveOut = new WaveOut();
waveOut.Init(osc);
waveOut.Play();
对于第二种情况(播放一串MIDI命令),再看看另一个Charles Petzold article。他的MidiStringPlayer
类提供了您需要的所有内容(但您可能需要删除WPF代码以便在需要的地方使用它)。使用NAudio播放MIDI的基本代码是:
using (MidiOut midiOut = new MidiOut(0))
{
midiOut.Send(MidiMessage.StartNote(60, 127, 0).RawData);
Thread.Sleep(1000);
midiOut.Send(MidiMessage.StopNote(60, 0, 0).RawData);
Thread.Sleep(1000);
}
如果你真的需要从字符串中播放音符,那么你必须解析它,代码太长而不能在这里发布,但在链接中你会找到所有内容。
答案 1 :(得分:2)
看起来像这样
Test.Properties.Resources.aaa这是mp3的路径
using (var ms = new MemoryStream(Test.Properties.Resources.aaa))
using (var rdr = new NAudio.Wave.Mp3FileReader(ms))
using (var wavStream = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(rdr))
using (var baStream = new NAudio.Wave.BlockAlignReductionStream(wavStream))
using (var waveOut = new NAudio.Wave.WaveOut(NAudio.Wave.WaveCallbackInfo.FunctionCallback())) {
waveOut.Init(baStream);
waveOut.Play();
while (waveOut.PlaybackState == NAudio.Wave.PlaybackState.Playing) {
System.Threading.Thread.Sleep(100);
}
}
答案 2 :(得分:1)
您可以通过将任何类型的文件添加到资源中来将其嵌入到项目中。
在Visual Studio中,您可以通过参数 - &gt;执行此操作。添加资源 - &gt;添加现有文件。
在我的案例中,我将资源文件命名为mySound。
然后,您可以通过添加以资源作为参数的SoundPlayer
来打开文件。
e.g。
SoundPlayer mysoundplayer = new SoundPlayer(MyAssemblyName.Properties.Resources.mySound);
mysoundplayer.Play();