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