Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有文件我怎么玩?_C#_.net_Audio_Naudio - Fatal编程技术网

C# 没有文件我怎么玩?

C# 没有文件我怎么玩?,c#,.net,audio,naudio,C#,.net,Audio,Naudio,我想在不从文件加载/流式传输的情况下播放铃声警报 我可以在代码中嵌入它的信号或音调吗?我正在使用NAudio 我的目的是通过删除IO操作来提高性能 我不想使用嵌入式资源。 只有我想在代码中生成铃声警报。您可以通过将任何类型的文件添加到资源中,将其嵌入到项目中 在Visual Studio中,您可以通过资源-->添加资源-->添加现有文件来完成此操作 在我的例子中,我将资源文件命名为mySound 然后,您可以通过添加一个以资源为参数的SoundPlayer来打开该文件 e、 g 对于NAudio

我想在不从文件加载/流式传输的情况下播放铃声警报

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

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

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

您可以通过将任何类型的文件添加到资源中,将其嵌入到项目中

在Visual Studio中,您可以通过资源-->添加资源-->添加现有文件来完成此操作

在我的例子中,我将资源文件命名为mySound

然后,您可以通过添加一个以资源为参数的
SoundPlayer
来打开该文件

e、 g


对于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);
   }
}

使用NAudio,您可以选择以下选项:

  • 播放(内存中)流中的文件。在其他答案中,您有相应的代码,实际上您甚至不需要NAudio来完成此任务,因为
    System.Media.SoundPlayer
    就足够了)
  • 生成将播放的信号(无需将其保存在某处)
  • 播放一串声音命令(就像我们以前在BASIC中使用
    play
    时所做的那样)
产生信号 第一个案例的例子来自一篇关于MSDN的文章(但也请看一下):

演奏迷笛 对于第二种情况(播放一串MIDI命令),请再次查看另一种情况。他的
midstringplayer
类提供了您所需要的一切(但是您可能需要去掉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);
}

如果您真的需要播放字符串中的注释,则必须对其进行解析,代码太长,无法在此处发布,但在链接中您可以找到所有内容。

如果您可以将文件嵌入为资源,只需使用该资源的流。感谢您的回复。事实上,我不想使用任何文件。因为速度快。我想使用文本代码(如RTTTL代码)在接到电话时振铃。+1还有一些警告:不需要使用最新NAudio的wavStream和baStream。另外,不要使用函数回调,而是使用WaveOutEvent类(或者如果您在WinForms中,只使用常规的WaveOut构造函数)。我不会一直睡到文件完成,但会很有效。
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();
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);
}