如何在没有文件的情况下播放?

时间:2012-11-19 13:23:22

标签: c# .net audio naudio

我想播放铃声警报而不加载/从文件中流式播放。

我可以在代码中嵌入它的信号或音调吗?我正在使用NAudio

我的目的是通过删除IO操作来提高性能。

我不想使用嵌入式资源。 只有我想在代码中生成铃声警报。

3 个答案:

答案 0 :(得分:3)

使用NAudio,您可以选择这样做:

  • 从流中播放文件(在内存中)。你有其他答案的代码,实际上你甚至不需要NAudio来完成这项任务'因为System.Media.SoundPlayer已经足够了。
  • 生成将要播放的信号(无需将其保存在某处)。
  • 播放一串声音命令(不知何故,就像我们在BASIC中使用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

对于第二种情况(播放一串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)

NAudio解决方案的

看起来像这样

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();