Tag: naudio

NAudio – 播放音频文件,等待2秒钟,再次播放音频文件

我是NAudio c#的新手,但我目前能够加载一个音频文件并在我的程序中播放。 现在,我希望能够循环播放此音频文件,但直到每隔2秒间隔播放一次。 我怎样才能做到这一点?

从流生成波形

我需要根据多个音频文件(.wav / .mp3)生成波形。 我目前正在使用NAudio,但我遇到了一些问题。 我不能使用文件的路径,因为我不允许将文件上传到服务器,大多数浏览器阻止路径(安全原因),所以我的方法是使用流或内存流。 我发现这个项目做了非常相似的事情,但是如果没有文件的直接路径,我就无法让它工作。 这是我从用户那里获取文件的代码 [HttpPost] public ActionResult UploadAudioFile() { if (Request.Files.Count > 0) { List list = new List(); var supportedFileTypes = new[] { “audio/mp3”, “audio/wav” }; foreach (string file in Request.Files) { var _file = Request.Files[file]; if (_file != null) { var contentType = _file.ContentType.ToLower(); if (supportedFileTypes.Contains(contentType)) { var s = […]

Windows 8.1 WPF应用程序mixerSetControlDetails返回MMSYSERR_ERROR

编辑 修改了NAudio源代码并稍加调试后,我发现在设置Value属性时调用的mixerSetControlDetails函数返回MMSYSERR_ERROR 。 有没有办法获得有关为什么mixerSetControlDetails失败的进一步信息? 我也愿意采用其他方式在C#上完成同样的事情。 原版的 我有一些代码可以计算语音能量,并使用NAudio根据此计算值设置麦克风增强级别。 我在读取音频样本时没有问题但是当我尝试设置麦克风增强时,程序会卡住。 我已在Windows 7,8和8.1上检查过该问题。 该问题仅在Windows 8.1上发生。 有趣的是,当我在Windows 8.1的虚拟机上运行该程序时,它按预期工作。 这可能是一个许可问题吗? 以下是设置增强值的代码 foreach (MixerControl mixerControl in MixerLine.Controls) { if (mixerControl.ControlType == MixerControlType.Volume) { UnsignedMixerControl volumeControl = (UnsignedMixerControl)mixerControl; volumeControl.Value = (uint) value; } } 使用此代码预先创建MixerLine的位置。 MixerLine = new MixerLine((IntPtr) deviceID, 0, MixerFlags.WaveIn);

使用NAudio将流数据保存到WAV文件

我想将传入的流数据保存到我的硬盘驱动器上的WAV文件中。 如何更改下面的代码才能将流记录到有效的WAV文件中? 从这里的演示: private void StreamMP3(object state) { this.fullyDownloaded = false; string url = (string)state; webRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse resp = null; try { resp = (HttpWebResponse)webRequest.GetResponse(); } catch(WebException e) { if (e.Status != WebExceptionStatus.RequestCanceled) { ShowError(e.Message); } return; } byte[] buffer = new byte[16384 * 4]; // Needs to be big enough to hold […]

试图理解C#中关于NAudio的缓冲区

我是一名化学专业学生,试图在C#中使用NAudio从我的计算机麦克风收集数据(计划稍后切换到音频端口,以防这与如何得到答案有关)。 我理解源流是什么,以及NAudio如何使用事件处理程序来知道是否开始从所述流中读取信息,但是在处理从流中读取的数据时我感到困惑。 据我了解,从源流(使用AddSamples命令)以字节或WAV格式填充缓冲区数组。 现在,我正在尝试做的就是填充缓冲区并在控制台上编写其内容或进行简单的可视化。 我似乎无法从缓冲区中获取我的值,并且我已经尝试将其视为WAV和字节数组。 有人能帮我理解NAudio如何从头开始工作,以及如何从缓冲区中提取数据并以更有用的格式(即双打)存储它? 这是我到目前为止处理NAudio的代码以及随之而来的所有代码: public NAudio.Wave.BufferedWaveProvider waveBuffer = null; // clears buffer NAudio.Wave.WaveIn sourceStream = null; // clears source stream public void startRecording(int samplingFrequency, int deviceNumber, string fileName) { sourceStream = new NAudio.Wave.WaveIn(); // initializes incoming audio stream sourceStream.DeviceNumber = deviceNumber; // specifies microphone device number sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(samplingFrequency, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels); // […]

获取带有NAudio的默认输出音频设备

我想使用NAudio获取默认输出音频设备(即我的扬声器),以获得此问题中的主音量。 我正在尝试使用MMDeviceEnumerator.GetDevice() ,但它所使用的id是一个字符串,而不是设备号。 这是我到目前为止编写的代码: var enumerator = new MMDeviceEnumerator(); for (int i = 0; i < WaveOut.DeviceCount; i++) { var cap = WaveOut.GetCapabilities(i); Console.WriteLine("{0}: {1}", i, cap.ProductName); var device = enumerator.GetDevice(???); } Console.WriteLine(); Console.ReadLine(); 我已经尝试将各种Guids从function以及字符串格式的设备ID传递给GetDevice()但它们都不起作用。 如何获取默认设备?

从多个WAV文件中删除标头,然后将剩余数据连接到一个RAW文件中

我有一个RAW音频文件,它由几个连接的,较小的WAV文件组成。 我可以在Sound Forge中以48,000,8位PCM,签名,单声道打开并播放此文件。 我想在C#中做的是用编程方式用相同或更小长度的新数据覆盖文件中的每个WAV,我认为我非常接近能够做到。 我可以在RAW文件上执行File.ReadAllBytes,循环遍历字节数组,并确定每个WAV的开始和结束位置。 然后我在我的电脑上选择新的WAV文件,删除标题,并将剩余的数据写入我的RAW文件。 如果新的WAV小于它的目的地,我用0填充差值。 然而,当我在上面提到的设置中打开Sound Forge中的新文件时,我的所有WAV看起来更像是固体块,而不是普通的“圣诞树”形状,它们都播放得很响亮而且扭曲。 在第一次遇到这个之后,我突然意识到我的所有新的源WAV都是41,000,16位PCM,有符号立体声格式。 我以这种格式打开了我新创建的RAW文件,它外观和播放都很好。 我想我必须将所有新的WAV转换为48,000,8位PCM,签名,单声道,然后运行应用程序将它们复制到RAW文件中。 我在使用NAudio编写了一些代码,在将数据复制到我的RAW文件之前对文件进行转换,但我仍然遇到了同样的问题。 我也尝试先在Sound Forge中手动转换每个新的WAV,但仍然遇到同样的问题。 我在这里想念的是什么? 谢谢。

NAudio:使用ASIO用吉他录制音频和输出

我目前正在研究SR。 设计项目是一个Windows窗体应用程序,允许用户插入他们的吉他并实时创建扭曲并使用输入和输出播放,并自动将其选中到ASCII选项卡。 目前我正在努力让实时听力部分正常工作,我对失真的记录和实现工作得很好,只是在使用ASIO时遇到了一些问题。 我看过这篇文章如何使用AsioOut录制和播放NAudio,但它对我的问题没什么帮助,这是我的代码: private BufferedWaveProvider buffer; private AsioOut input; private AsioOut output; private void listenBtn_Click(object sender, EventArgs e) { input = new AsioOut(RecordInCbox.SelectedIndex); WaveFormat format = new WaveFormat(); buffer = new BufferedWaveProvider(format); buffer.DiscardOnBufferOverflow = true; input.InitRecordAndPlayback(buffer, 1, 44100); input.AudioAvailable += new EventHandler(AudioAvailable); //output = new AsioOut(RecordInCbox.SelectedIndex); //output.Init(buffer); input.Play(); //output.Play(); } public void AudioAvailable(object sender, […]

检测一首歌中的节拍

我正在开发一个项目,要求我在应用程序中播放歌曲时添加节拍检测(WinForms – C#)。 我目前正在使用NAudio.NET播放歌曲并显示有关歌曲的详细信息。 是否有一个库允许我这样做或某种方式手动检测这个? 我不期待一个完整的解决方案,但指向正确的方向。 理想情况下,我希望这是一个实时检测,但它不是必需的。

将PCM转换为MP3 / OGG

我需要将连续的PCM流或编码音频(ADPCM,uLaw,Opus)转换为MP3 / OGG格式,以便可以将其流式传输到浏览器(使用html的音频标签)。 我有“stream-mp​​3 / ogg-using-audio-tag”部分工作,现在我需要开发转换层。 我有两个问题: 如何使用NAudio和/或其他一些C#库/框架将PCM转换为MP3 / OGG? 我假设NAudio演示应用程序中有一个或两个代码片段可能正在执行此操作,但我无法找到它。 在将其转换为MP3 / OGG之前,我是否必须将编码数据(ADPCM,uLaw,OPUS)转换为PCM(我可以),或者MP3 / OGG’容器’是否可以接受编码数据? 注意:我理解MP3存在许可问题,因此我们愿意使用OGG。 谢谢。