C# 为什么NAudio在播放文件之后而不是之前读取缓冲区中的零?

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

以下代码将成功加载、播放、编辑音频样本并(几乎)写入音频文件。我这样说几乎是因为当我注释掉“Play”代码时,它可以工作,但将其保留在其中会导致缓冲区读取:

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只有一个音频文件阅读器,但有两个不同的东西正在从中读取。