wav 文件连接异常与 naudio 库

Posted

技术标签:

【中文标题】wav 文件连接异常与 naudio 库【英文标题】:wav file concatenation exception with naudio library 【发布时间】:2015-06-09 20:08:14 【问题描述】:

我使用了我在这个论坛上找到的以下方法。 在我的 WPF 用户界面中,我有一个按钮调用此方法以连接一些声音文件并播放新文件。 第一次单击后生成连接文件,我等待播放文件结束。然后,我想创建一个新的连接文件,但是 - 如果我再次单击,我在这行代码中得到一个异常:

// first time in create new Writer
waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat);

“在 mscorlib.dll 中发生了“System.IO.IOException”类型的异常,但未在用户代码中处理

附加信息:该进程无法访问文件“C:\Users\alon\Documents\Visual Studio 2013\Projects\MyMahappsExtended\MyMahappsExtended\bin\Debug\Sounds\mySendFile.wav”,因为它正被另一个进程使用。”

我不知道问题出在哪里。

public static void Concatenate(string outputFile, IEnumerable<string> sourceFiles)
    
        byte[] buffer = new byte[8820];
        WaveFileWriter waveFileWriter = null;

        try
        
            foreach (string sourceFile in sourceFiles)
            
                using (WaveFileReader reader = new WaveFileReader(sourceFile))
                
                    if (waveFileWriter == null)
                    
                        // first time in create new Writer
                        waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat);
                    
                    else
                    
                        if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat))
                        
                            throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format");
                        
                    
                    int read;
                    while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
                    
                        waveFileWriter.WriteData(buffer, 0, read);
                    
                
            
        
        finally
        
            if (waveFileWriter != null)
            
                waveFileWriter.Dispose();
            
        
    

更新: 这段代码调用了上面的代码:

private async void mySendButton_Click(object sender, RoutedEventArgs e)
    
        myRing.IsActive = true;
        List<string> myList = new List<string>();
        //Here I want to add to the list a Start Delimiter
        myList.Add("Sounds\\silence.wav");
        myList.Add("Sounds\\10000_0.2s.wav");

        //string bits = GetBits(myTextBox.Text);
        string bits = GetBits2(new TextRange(myTextBox.Document.ContentStart, myTextBox.Document.ContentEnd).Text);
        foreach (char c in bits)
        
            if (c == '0')
            
                myList.Add("Sounds\\13000_0.015s.wav");
            
            else
            
                myList.Add("Sounds\\13100_0.015s.wav");
            
        
        //Here I want to add to the list a Finish Delimiter

        myList.Add("Sounds\\11000_0.2s.wav");
        myList.Add("Sounds\\silence.wav");

        Concatenate("Sounds\\mySendFile.wav", myList);

        MediaPlayer mplayer = new MediaPlayer();
        mplayer.Open(new Uri("Sounds\\mySendFile.wav", UriKind.Relative));
        mplayer.Play();
        await Task.Delay((int)(1000*(bits.Length*BitTime+4*StartDelimiterTime+4*EndDelimiterTime)));
        myRing.IsActive = false;

    

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 我认为这段代码很好——它在这里完美地执行了我。其他东西正在锁定文件。你能显示任何其他适用于“输出文件”的代码吗? 你好,我编辑了我的问题 有时它会工作 3 或 4 次,但它会抛出上述异常...... 【参考方案1】:

在等待语句之后,我必须关闭 MediaPlayer 类:

mplayer.close();

致谢:@CodeCaster:https://***.com/users/266143/codecaster

【讨论】:

以上是关于wav 文件连接异常与 naudio 库的主要内容,如果未能解决你的问题,请参考以下文章

HRESULT:尝试使用 NAudio 库播放 mp2 编码的 wav 文件时出现 0xC00D5212

使用 NAudio 将 g722 音频转换为 WAV

错误的 .wav 格式录制音频 NAudio 库

在播放 mp3 或 wav 时结合 NAudio Pan 和 JSNet SuperPitch

NAudio - 读取和写入 Wav 文件

使用 NAudio 处理后播放 wav 文件