标签: naudio

NAudio使用C#播放正弦波x毫秒

我正在使用NAudio播放给定频率的正弦波,如在NAudio的博客文章Playback of Sine Wave中.我只想让声音播放()x毫秒,然后停止.

我尝试了一个thread.sleep,但声音立即停止.我尝试了一个计时器,但是当处理WaveOut时,会出现一个跨线程异常.

我尝试了这段代码,但是当我打电话给beep时,程序会冻结.

public class Beep
{
    public Beep(int freq, int ms)
    {
        SineWaveProvider32 sineWaveProvider = new SineWaveProvider32();
        sineWaveProvider.Amplitude = 0.25f;
        sineWaveProvider.Frequency = freq;

        NAudio.Wave.WaveOut waveOut = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
        waveOut.Init(sineWaveProvider);
        waveOut.Play();
        Thread.Sleep(ms);
        waveOut.Stop();
        waveOut.Dispose();
    }
}

public class SineWaveProvider32 : NAudio.Wave.WaveProvider32
{
    int sample;

    public SineWaveProvider32()
    {
        Frequency = 1000;
        Amplitude = 0.25f; // Let's not hurt our ears
    }

    public float Frequency { get; set; }
    public float Amplitude { …
Run Code Online (Sandbox Code Playgroud)

c# trigonometry naudio wave

6
推荐指数
1
解决办法
4716
查看次数

使用NAudio修剪mp3文件

是否可以使用NAudio修剪MP3文件?我正在寻找一种方法来获取一个标准的mp3文件,并采取它的一部分,使其成为一个单独的MP3.

c# naudio

6
推荐指数
2
解决办法
3756
查看次数

褪色声音输入/输出

我有无限循环播放的背景音.当用户按下按钮时我希望它淡出.

我尝试了以下方法:

  • 使用WaveStream启动DirectSoundOut
  • 计时器会更改WaveChannel32的音量.

问题:

  • 在播放声音时改变音量会产生噪音.

有谁知道更好的解决方案?

c# naudio

6
推荐指数
1
解决办法
3465
查看次数

.Net如何直接播放音频样本

我有通过NAudio提取的音频样本,我知道参数:

  • 渠道
  • 每个样本的字节数
  • 采样率

如何使用.Net api /或其他.Net库播放该示例

这里代码:

    openFileDialog1.ShowDialog();
    using (var reader = new Mp3FileReader(openFileDialog1.FileName))
    {
        var pcmLength = (int)reader.Length;
        var _leftBuffer = new byte[pcmLength / 2];
        var buffer = new byte[pcmLength];
        var bytesRead = reader.Read(buffer, 0, pcmLength);
        int index = 0;
        for (int i = 0; i < bytesRead; i += 4)
        {
           //extracting only left channel 
           _leftBuffer[index] = buffer[i];
           index++;
           _leftBuffer[index] = buffer[i + 1];
           index++;
         }

         // How to play  _leftBuffer (Single channel, 2 bytes per sample, …
Run Code Online (Sandbox Code Playgroud)

.net c# audio naudio

6
推荐指数
1
解决办法
6048
查看次数

我如何使用LAME将wav编码为mp3 c#

我目前正在使用NAudio捕获声音,它只创建一个wav文件.我正在寻找一种方法,在保存文件之前将其编码为mp3.我找到了LAME,但是当我尝试添加lame_enc.dll文件时,它说"无法添加引用.请确保该文件是可访问的,这是一个有效的程序集或COM组件".任何帮助,将不胜感激.

c# naudio lame

6
推荐指数
2
解决办法
1万
查看次数

Windows 2012 64位服务器是否支持Media Foundation?

Windows 2012 64位服务器是否支持Media Foundation?我们不能将Windows 7或Windows 8作为服务器,这就是我们选择Windows 2012服务器的原因.

随着NAudio 1.7现已发布,我们希望利用Media Foundation的新功能.

任何建议都非常感谢.

naudio lame c#-4.0

6
推荐指数
1
解决办法
1万
查看次数

如何拆分和管道多个NAudio流

我有一个C#项目,使用来自Kinect 1,Kinect 2,Microphone或其他任何东西的输入音频流.

waveIn.DataAvailable += (object sender, WaveInEventArgs e) => {
  lock(buffer){
    var pos = buffer.Position;
              buffer.Write(e.Buffer, 0, e.BytesRecorded);
              buffer.Position = pos;
  }
};
Run Code Online (Sandbox Code Playgroud)

缓冲区变量是来自组件A的流,它将由处理Streams的SpeechRecognition组件B处理.

我将添加新的组件C,D,E,在Streams上工作以计算音高,检测声音,做指纹或其他任何事情......

如何为组件C,D,E复制该流?

  • 组件A发送一个事件"我有一个流做你想要的"我不想通过一个事件"给我你的你的流"来反转逻辑

  • 我正在寻找一个"MultiStream",可以给我一个Stream实例,并将处理这项工作

组件A.

var MultiStream buffer = new MultiStream()
...
SendMyEventWith(buffer)
Run Code Online (Sandbox Code Playgroud)

组分B,C,D,E

public void HandleMyEvent(MultiStream buffer){
  var stream = buffer.GetNewStream();
  var engine = new EngineComponentB()
      engine.SetStream(stream);
}
Run Code Online (Sandbox Code Playgroud)
  • MultiStream必须是一个Stream来包装Write()方法(因为Stream没有数据可用的机制)?
  • 如果一个Stream是由Component B Dispose(),MultiStream应该从它的数组中删除它?
  • MultiStream必须在Read()上抛出异常才能要求使用GetNewStream()

编辑:Kinect 1提供了一个Stream本身... :-(我应该使用一个Thread来泵入MultiStream吗?

有没有人有这种MultiStream类?

谢谢

c# stream naudio

6
推荐指数
1
解决办法
370
查看次数

如何从音频文件中获取浮点数组样本

我正在开发适用于音频数据的UWP应用程序(适用于Windows 10).它以浮点数样本的形式在开始时接收样本缓冲区,这些项目从-1f变为1f.之前我使用过NAudio.dll 1.8.0,它提供了所有必要的功能.使用WaveFileReader,waveBuffer.FloatBuffer,WaveFileWriter类.但是,当我完成此应用程序并尝试构建Relese版本时,出现此错误:ILT0042:当前不支持指针类型的数组:'System.Int32*[]'.

我试图解决它:

1)https://forums.xamarin.com/discussion/73169/uwp-10-build-fail-arrays-of-pointer-types-error

有建议删除.dll的链接,但我需要它.

2)我尝试使用Manage NuGet Packages安装相同版本的NAudio,但WaveFileReader,WaveFileWriter不可用.

3)在NAudio开发人员的回答中(如何使用NAudio在Windows 10中存储.wav文件)我已经阅读了有关使用AudioGraph的内容,但我只能在实时播放中构建浮点数组样本,但我需要获取完整的示例包音频文件上传后立即.在录制过程或播放过程中获取样本的示例:https: //docs.microsoft.com/ru-ru/windows/uwp/audio-video-camera/audio-graphs

这就是我需要帮助的原因:如何在音频文件上传后让FloatBuffer处理样本?例如,用于构建音频波或计算音频效果应用.

先感谢您.


  1. 我曾尝试使用FileStream和BitConverter.ToSingle(),但是与NAudio相比,我有不同的结果.换句话说,我仍在寻找解决方案.

    private float[] GetBufferArray()
    {
        string _path = ApplicationData.Current.LocalFolder.Path.ToString() + "/track_1.mp3";
        FileStream _stream = new FileStream(_path, FileMode.Open);
        BinaryReader _binaryReader = new BinaryReader(_stream);
        int _dataSize = _binaryReader.ReadInt32();
        byte[] _byteBuffer = _binaryReader.ReadBytes(_dataSize);
    
        int _sizeFloat = sizeof(float);
        float[] _floatBuffer = new float[_byteBuffer.Length / _sizeFloat];
        for (int i = 0, j = 0; i < _byteBuffer.Length - _sizeFloat; i += _sizeFloat, j++)
        {
            _floatBuffer[j] = …
    Run Code Online (Sandbox Code Playgroud)

c# naudio audiobuffer uwp naudio-framework

6
推荐指数
1
解决办法
2216
查看次数

NAudio 的 BufferedWaveProvider 在录制和混合音频时变满

我遇到了来自 NAudio 库的 BufferedWaveProvider 的问题。我正在录制 2 个音频设备(一个麦克风和一个扬声器),将它们合并为 1 个流并将其发送到编码器(用于视频)。

为此,我执行以下操作:

  1. 创建一个线程,我将使用WasapiCapture.
  2. 创建一个线程,我将在其中使用WasapiLookbackCapture. (我也使用 aSilenceProvider所以我记录的内容没有空白)。
  3. 我想混合这两个音频,所以我必须确保它们具有相同的格式,所以我检测所有这些音频设备中最好的 WaveFormat 是什么。在我的场景中,它是扬声器。所以我决定麦克风音频将通过 aMediaFoundationResampler来调整其格式,使其与扬声器中的音频相同。
  4. Wasapi(Lookback)Capture 中的每个音频块都发送到BufferedWaveProvider.
  5. 然后,我还制作了一个MixingSampleProviderISampleProvider从每个录制线程传递的地方。所以我通过MediaFoundationResampler麦克风和BufferedWaveProvider扬声器。
  6. 在第三个线程的循环中,我从 读取数据MixingSampleProvider,它应该BufferedWaveProvider在填充时异步清空(s)。
  7. 因为每个缓冲区可能不会完全同时填充,所以我正在查看这两个缓冲区之间的最小共同持续时间是多少,并且我正在从混合样本提供程序中读取这个数量。
  8. 然后我将阅读的内容排入队列,以便我的编码器在第 4 个线程中也将并行处理它。

请参阅下面的流程图,它说明了我上面的描述。

在此处输入图片说明

我的问题如下:

  • 在玩也使用麦克风的视频游戏(用于在线多人游戏)时,录制麦克风和扬声器超过 1 小时时,它的效果非常好。没有崩溃。缓冲区一直很空。这很棒。
  • 但出于某种原因,每次我尝试使用我的应用during进行 Discord、Skype 或 Teams 音频对话时,我都会立即(在 5 秒内)崩溃,BufferedWaveProvider.AppSamples因为缓冲区已满。

在调试模式下查看它,我可以看到:

  • 扬声器对应的缓冲区几乎是空的。它的平均音频最长为 100 毫秒。
  • 与麦克风(我重新采样的那个)对应的缓冲区已满(5 秒)。

从我在 NAudio 的作者博客、文档和 StackOverflow 上阅读的内容来看,我认为我正在做最佳实践(但我可能是错的),即从一个线程写入缓冲区,并从另一个线程并行读取它. 当然有一种风险,它比我阅读它的速度更快,这基本上就是现在正在发生的事情。但我不明白为什么。

需要帮助

我需要一些帮助来理解我在这里遗漏了什么,请。以下几点让我感到困惑:

  1. 为什么这个问题只发生在 …

c# audio audio-streaming naudio wasapi

6
推荐指数
1
解决办法
240
查看次数

使用 imovie 导出的 wav 时出现 Naudio“NoDriver 调用 acmFormatSuggest”错误

我正在尝试将 .wav 转换为 .mp3 文件。我的代码通常可以工作,但现在我得到了一个使用 Imovie 导出的 .wav 文件,并且收到错误“NoDriver 调用 acmFormatSuggest”。

互联网表明我的机器缺少编解码器。但是如果我运行该文件,我的机器能够使用标准 Windows 媒体播放器播放该文件,所以我猜它在我的机器上。

当我将文件放入https://www.metadata2go.com/时,我可以看到有问题的文件的编解码器 pcm_s24le 的采样率为 48000。

当我使用相同的编解码器 pcm_s24le 但采样率为 44100 创建文件时,代码不会触发此错误。所以问题似乎出在组合编解码器 - 采样率上。

Naudio 的 github 页面引用了此页面,并提供了修复错误的指南。它在选项 5 下说(在我的示例中我只播放 wav 文件)

您需要做的是在网络上搜索可以解码您正在使用的格式的 ACM 编解码器。不幸的是,这并不总是一个简单的过程,

不幸的是,它没有提供有关如何或在哪里找到这些编解码器的任何帮助。而且,由于我能够播放该文件,并且具有不同采样率的相同编解码器工作正常,因此我也不确定这是否是实际问题。

我的代码在 Windows 11 pro v21H2 上运行。

以下基本代码(这不是我的转换代码)会引发错误

var outputDevice = new WaveOutEvent();
var audioFile = new AudioFileReader(path);
outputDevice.Init(audioFile);
outputDevice.Play();
Run Code Online (Sandbox Code Playgroud)

打开 wav 文件并以不同的采样率保存它似乎可以解决问题,但这是我宁愿不做的体力劳动,因为在我的情况下可能有很多文件需要转换。

任何想法,将不胜感激。

c# wav imovie naudio

6
推荐指数
1
解决办法
187
查看次数