我正在使用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) 是否可以使用NAudio修剪MP3文件?我正在寻找一种方法来获取一个标准的mp3文件,并采取它的一部分,使其成为一个单独的MP3.
我有无限循环播放的背景音.当用户按下按钮时我希望它淡出.
我尝试了以下方法:
问题:
有谁知道更好的解决方案?
我有通过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) 我目前正在使用NAudio捕获声音,它只创建一个wav文件.我正在寻找一种方法,在保存文件之前将其编码为mp3.我找到了LAME,但是当我尝试添加lame_enc.dll文件时,它说"无法添加引用.请确保该文件是可访问的,这是一个有效的程序集或COM组件".任何帮助,将不胜感激.
Windows 2012 64位服务器是否支持Media Foundation?我们不能将Windows 7或Windows 8作为服务器,这就是我们选择Windows 2012服务器的原因.
随着NAudio 1.7现已发布,我们希望利用Media Foundation的新功能.
任何建议都非常感谢.
我有一个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)
编辑:Kinect 1提供了一个Stream本身... :-(我应该使用一个Thread来泵入MultiStream吗?
有没有人有这种MultiStream类?
谢谢
我正在开发适用于音频数据的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处理样本?例如,用于构建音频波或计算音频效果应用.
先感谢您.
我曾尝试使用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)我遇到了来自 NAudio 库的 BufferedWaveProvider 的问题。我正在录制 2 个音频设备(一个麦克风和一个扬声器),将它们合并为 1 个流并将其发送到编码器(用于视频)。
为此,我执行以下操作:
WasapiCapture.WasapiLookbackCapture. (我也使用 aSilenceProvider所以我记录的内容没有空白)。MediaFoundationResampler来调整其格式,使其与扬声器中的音频相同。BufferedWaveProvider.MixingSampleProvider我ISampleProvider从每个录制线程传递的地方。所以我通过MediaFoundationResampler麦克风和BufferedWaveProvider扬声器。MixingSampleProvider,它应该BufferedWaveProvider在填充时异步清空(s)。请参阅下面的流程图,它说明了我上面的描述。
during进行 Discord、Skype 或 Teams 音频对话时,我都会立即(在 5 秒内)崩溃,BufferedWaveProvider.AppSamples因为缓冲区已满。在调试模式下查看它,我可以看到:
从我在 NAudio 的作者博客、文档和 StackOverflow 上阅读的内容来看,我认为我正在做最佳实践(但我可能是错的),即从一个线程写入缓冲区,并从另一个线程并行读取它. 当然有一种风险,它比我阅读它的速度更快,这基本上就是现在正在发生的事情。但我不明白为什么。
我需要一些帮助来理解我在这里遗漏了什么,请。以下几点让我感到困惑:
为什么这个问题只发生在 …
我正在尝试将 .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 文件并以不同的采样率保存它似乎可以解决问题,但这是我宁愿不做的体力劳动,因为在我的情况下可能有很多文件需要转换。
任何想法,将不胜感激。