C# 为什么NAudio在播放文件之后而不是之前读取缓冲区中的零?
以下代码将成功加载、播放、编辑音频样本并(几乎)写入音频文件。我这样说几乎是因为当我注释掉“Play”代码时,它可以工作,但将其保留在其中会导致缓冲区读取:C# 为什么NAudio在播放文件之后而不是之前读取缓冲区中的零?,c#,vlc,naudio,audacity,C#,Vlc,Naudio,Audacity,以下代码将成功加载、播放、编辑音频样本并(几乎)写入音频文件。我这样说几乎是因为当我注释掉“Play”代码时,它可以工作,但将其保留在其中会导致缓冲区读取: audioFile.Read(buffer, 0, numSamples); 结果为零 我是否需要以某种方式重置音频文件?我发现的所有例子都没有提到这一点 using System; using NAudio.Wave; namespace NAudioTest { class TestPlayer { static void
audioFile.Read(buffer, 0, numSamples);
结果为零
我是否需要以某种方式重置音频文件?我发现的所有例子都没有提到这一点
using System;
using NAudio.Wave;
namespace NAudioTest
{
class TestPlayer
{
static void Main(string[] args)
{
string infileName = "c:\\temp\\pink.wav";
string outfileName = "c:\\temp\\pink_out.wav";
// load the file
var audioFile = new AudioFileReader(infileName);
// play the file
var outputDevice = new WaveOutEvent();
outputDevice.Init(audioFile);
outputDevice.Play();
//Since Play only means "start playing" and isn't blocking, we can wait in a loop until playback finishes....
while (outputDevice.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(1000); }
// edit the samples in file
int fs = audioFile.WaveFormat.SampleRate;
int numSamples = (int)audioFile.Length / sizeof(float); // length is the number of bytes - 4 bytes in a float
float[] buffer = new float[numSamples];
audioFile.Read(buffer, 0, numSamples);
float volume = 0.5f;
for (int n = 0; n < numSamples; n++) { buffer[n] *= volume; }
// write edited samples to new file
var writer = new WaveFileWriter(outfileName,audioFile.WaveFormat);
writer.WriteSamples(buffer,0,numSamples);
}
}
使用系统;
使用NAudio.波;
名称空间恶心测试
{
类TestPlayer
{
静态void Main(字符串[]参数)
{
字符串infileName=“c:\\temp\\pink.wav”;
string outfileName=“c:\\temp\\pink\u out.wav”;
//加载文件
var audioFile=新的AudioFileReader(infileName);
//播放文件
var outputDevice=new WaveOutEvent();
outputDevice.Init(音频文件);
outputDevice.Play();
//因为Play只意味着“开始播放”,而不是阻塞,所以我们可以循环等待,直到播放结束。。。。
while(outputDevice.PlaybackState==PlaybackState.Playing){System.Threading.Thread.Sleep(1000);}
//编辑文件中的示例
int fs=audioFile.WaveFormat.SampleRate;
int numSamples=(int)audioFile.Length/sizeof(float);//Length是字节数-float中的4个字节
float[]buffer=新的float[numSamples];
读取(缓冲区,0,numSamples);
浮子体积=0.5f;
对于(int n=0;n
}在写入程序成为有效的WAV文件之前,必须调用写入程序上的
Dispose
。我建议您使用块将其放入中
using(var writer = new WaveFileWriter(outfileName,audioFile.WaveFormat))
{
writer.WriteSamples(buffer,0,numSamples);
}
获取audacity源代码并调试它为何无法运行-这是找到它的最终方法,这将是一项巨大的工作,如果我对audacity的源代码有足够的了解,我可能不会尝试学习如何使用NAudio实现这些东西。我很确定问题出在我的代码上,而不是audacity的读取wav文件的能力。只是说如果你没有得到任何其他答案,那就是解决方案嗨,谢谢,但不幸的是,我认为这只是问题解决的一部分。几天前,我根据事态发展编辑了这个问题。看来,对“播放”部分的评论决定了缓冲区中读取的内容。最好是提出新问题,而不是编辑现有问题,因为现在的答案没有意义。你的问题的答案是,有了播放功能,现在有两种东西(声卡和波形文件编写器)从一个来源读取。谢谢马克,我不明白为什么会发生这种情况。它表明,虽然两个独立的行动依赖于相同的基础数据;它们相互影响,尽管彼此无关。我怎样才能把它们分开?或者你更愿意我开始一个新的职位?Kind Regards只有一个音频文件阅读器,但有两个不同的东西正在从中读取。