到目前为止,我已经实现了在这篇博客文章中找到的算法,但成效有限.
我的程序的概念是初始化正弦波,然后根据鼠标在屏幕上的位置改变频率 - 向上移动鼠标并且正弦波变高,反之亦然(基本上是使用鼠标的这种类型的仪器).
到目前为止我所实现的问题是,当正弦波的频率更新时,会发出咔嗒声,而不是提供平滑的频率扫描,使其听起来像是有离散的频率级别.我一直在NAudio论坛和这里搜索高低,但似乎没有其他人尝试使用NAudio做这种事情,或者其他任何声音模块 - 所有类似的程序执行类似地使用像Kinect这样的设备使用虚拟midi布线和现有的软件模块,但我想在不依赖外部软件包的情况下实现相同的概念.
我已经发布了有关这一问题的n音讯的论坛我的代码段在这里 ,正如你所看到的,我通过如下MarkHeath对这里建议,试图找到一个解决我的问题.
好吧,我知道这对某些人来说听起来很容易,但我真的被困在这里了.实际上,我正在使用Naudio构建一个音频播放器,我已经意识到在许多教程中,人们总是会展示一些简单的方法来帮助您入门.但是,在我看来,他们总是忘记展示在实际应用中实际完成的事情.例如,在与Naudio一起播放音乐时,我会做类似的事情:
Void PlayAudioMusic(string FilePath)
{
using (var ms = File.OpenRead(FilePath))
using (var rdr = new Mp3FileReader(ms))
using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr))
using (var baStream = new BlockAlignReductionStream(wavStream))
using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(baStream);
waveOut.Play();
}
}
Run Code Online (Sandbox Code Playgroud)
这非常适合在简单的控制台应用程序中进行测试.但是,如果您实际构建了一个严肃的应用程序,这将无用.例如,许多教程从未说过的是例如如何处理最关键的事情,例如:
谢谢.
我正在尝试使用 NAudio 库中的控件,例如 WaveViewer、VolumeMeter、VolumeSlider、Fader、WaveformPainter 等。我使用的是 Visual Studio 2012 并安装了 net 4.5。我还下载并引用了 NAudio 1.7 及其 .dll 到我的项目中。当我右键单击工具箱并单击选择项目,导航到 .NET 组件选项卡并选择浏览,单击 NAudion dll,然后检查这些新控件以添加时,会出现一个消息框,并显示以下错误:
添加了控件 Fader、PanSlider、Pot、VolumeMeter、VolumeSlider、WaveformPainter、WaveViewer。确保添加的控件与当前设计器和 .NET Framework 版本兼容。
我尝试重置工具箱并重新添加这些控件。
我正在使用 VS2012 创建一个 WPF 项目来播放视频并在下面显示它的波形(我已经将音频提取到一个 .wav 文件中,如果我只能得到这些,我希望使用 NAudio 中的一个控件来显示该文件要启用的控件 - 不会变灰 - 在设计器的工具箱中。)
我是 c# 和 WPF 以及 NAudio 的新手,因此非常感谢任何帮助。
我能够使用naudio将音频捕获到文件中,现在我希望它在byte []或stream in c#中.
this.writer = new WaveFileWriter(this.outputFilename, this.waveIn.WaveFormat);
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试的是在WaveFileWriter构造函数中传递输出文件名,而不是传递MemoryStream对象.参考流对象,一旦录制结束,我尝试使用Soundplayer播放它.
private IWaveIn waveIn;
private WaveFileWriter writer;
private string outputFilename;
private Stream memoryStream;
public void onRecord(object inputDevice, string fileName)
{
if (this.waveIn == null)
{
this.outputFilename = fileName;
this.waveIn = new WasapiLoopbackCapture((MMDevice)inputDevice);
if(memoryStream == null)
memoryStream = new MemoryStream();
this.writer = new WaveFileWriter(this.memoryStream,this.waveIn.WaveFormat);
this.waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(this.OnDataAvailable);
this.waveIn.RecordingStopped += new EventHandler<StoppedEventArgs>(this.OnRecordingStopped);
this.waveIn.StartRecording();
}
}
private void OnDataAvailable(object sender, WaveInEventArgs e)
{
this.writer.Write(e.Buffer, 0, e.BytesRecorded);
}
public void OnRecordingStopped(object sender, StoppedEventArgs e) …Run Code Online (Sandbox Code Playgroud) 我的代码运行并创建一个 test.wav 但该文件不包含任何内容。我正在尝试在控制台应用程序中运行此代码。请帮忙
using System;
using System.Media;
using NAudio;
using NAudio.Wave;
class sound
{
public static void Main()
{
WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(0);
Console.WriteLine("Now recording...");
WaveInEvent waveSource = new WaveInEvent();
waveSource.DeviceNumber = 0;
waveSource.WaveFormat = new WaveFormat(16000, deviceInfo.Channels);
//waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
string tempFile = (@"C:\Users\user\Desktop\test1.wav");
WaveFileWriter waveFile = new WaveFileWriter(tempFile, waveSource.WaveFormat);
waveSource.StartRecording();
}
//void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
//{
// wavefile.WriteData(e.Buffer, 0, e.BytesRecorded);
//}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下注释的行是什么意思吗?我是编程初学者。
当我编译程序时,出现 2 个错误: 错误 1:非静态字段、方法或属性“sound.waveSource_DataAvailable(object, NAudio.Wave.WaveInEventArgs)”需要对象引用 C:\Users\user\文件\Visual Studio 2008\项目\声音\声音\Program.cs 18 49 声音
错误 …
假设我的 WAV 文件包含 16 位 PCM,我如何将 wav 文件读取为双数组:
using (WaveFileReader reader = new WaveFileReader("myfile.wav"))
{
Assert.AreEqual(16, reader.WaveFormat.BitsPerSample, "Only works with 16 bit audio");
byte[] bytesBuffer = new byte[reader.Length];
int read = reader.Read(bytesBuffer, 0, buffer.Length);
// HOW TO GET AS double ARRAY
}
Run Code Online (Sandbox Code Playgroud) 我是一名化学专业的学生,试图在 C# 中使用 NAudio 从我的计算机麦克风收集数据(计划稍后切换到音频端口,以防这与如何回答有关)。我了解源流是什么,以及 NAudio 如何使用事件处理程序来知道是否开始从所述流中读取信息,但是在处理从流中读取的数据时,我感到很困惑。据我了解,缓冲区数组是从源流中以字节或 WAV 格式填充的(使用 AddSamples 命令)。现在,我要做的就是填充缓冲区并将其内容写入控制台或进行简单的可视化。我似乎无法从缓冲区中获取我的值,并且我尝试将其视为 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); // specifies sampling frequency, channels
waveBuffer = new NAudio.Wave.BufferedWaveProvider(sourceStream.WaveFormat); // initializes buffer
sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); …Run Code Online (Sandbox Code Playgroud) 我正在尝试增加代码中声波的振幅。我有一个缓冲区,其中包含制作波形所需的所有字节。
这是我的音频播放代码:
public void AddSamples(byte[] buffer)
{
//somehow adjust the buffer to make the sound louder
bufferedWaveProvider.AddSamples(buffer, 0, buffer.Length);
WaveOut waveout = new WaveOut();
waveout.Init(bufferedWaveProvider);
waveout.Play();
//to make the program more memory efficient
bufferedWaveProvider.ClearBuffer();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 tcp 套接字连接将音频从一台计算机单向流式传输到另一台计算机。
计算机 1 ---> 交换机 ---> 计算机 2
计算机 1 是发送方/客户端,计算机 2 是播放音频的接收方/服务器。
我设法让它发挥作用,但收到了很多噪音。
CS核心:
这是我目前用来发送数据的代码:
CaptureInstance = new WasapiLoopbackCapture();
CaptureInstance.Initialize();
CaptureInstance.DataAvailable += (s, a) => onStart(s, a);
CaptureInstance.Start();
Run Code Online (Sandbox Code Playgroud)
其中 onStart 只是使用 BinaryWriter 将字节写入套接字的流:
writer.Write(a.Data, a.Offset, a.ByteCount);
Run Code Online (Sandbox Code Playgroud)
这是我目前在接收计算机上用于播放音频的代码:
int size = 3840;
WriteableBufferingSource src = new WriteableBufferingSource(new CSCore.WaveFormat(48000, 32, 2)) { FillWithZeros = true };
WasapiOut soundOut = new WasapiOut();
soundOut.Initialize(src);
soundOut.Play();
while (true)
{
byte[] bytes = reader.ReadBytes(size); // BinaryReader
src.Write(bytes, 0, size);
}
Run Code Online (Sandbox Code Playgroud)
NA音频:
经过进一步的搜索、试验和错误,我设法使用 NAudio …
我正在开发一种音乐制作应用程序,其中包括音频播放。我目前遇到播放不一致的问题。我用来进行节拍的计时器似乎在某些滴答事件上跳过或滞后。您可以听到示例视频中的停顿: 视频
我像这样实现计时器及其事件
private void Method()
{
///some other code here
//the math for the timer period is to figure out how many times the timer should tick in 1 minute.
int _period = (int)Math.Round(60000f / (float)NUD_ConfigBPM.Value, MidpointRounding.AwayFromZero)
_threadtimer = new System.Threading.Timer(_ => _threadtimer_Tick(), null, 0, _period);
}
private void _threadtimer_Tick()
{
//vorbis is a List<List<CachedSound>>
//each beat can have several sounds to play at once
foreach (var _sample in vorbis[_playbackbeat]) {
AudioPlaybackEngine.Instance.PlaySound(_sample);
}
//simulating a playhead by highlighting …Run Code Online (Sandbox Code Playgroud)