使用C#保存MemoryStream为MP3文件时生成0字节文件的问题求助
解决MP3 MemoryStream写入文件后大小为0的问题
我来帮你定位问题并给出修复方案,这个场景在音频流处理里挺常见的:
核心问题拆解
你的代码里有两个关键疏漏,直接导致了空文件的出现:
- MemoryStream的位置指针没重置:当你把WAV数据通过
CopyTo写入MP3写入器后,nSpeakStreamAsMp3的Position会停留在流的末尾。这时候直接往文件流复制的话,没有任何数据可以读取,自然生成0字节的文件。 - 未触发MP3写入器的缓冲刷新:
LameMP3FileWriter内部有缓冲机制,完成CopyTo后可能还有部分数据滞留在缓冲里,没真正写入到内存流中。
另外你的代码片段里nSpeakStreamAs...是不完整的,应该是要调用CopyTo(nFile),不过即使补全,上面两个问题不解决还是会得到空文件。
修复后的完整代码
using (var nSpeakStreamAsMp3 = new MemoryStream()) using (var nWavFileReader = new WaveFileReader(nSpeakStream)) using (var nMp3Writer = new LameMP3FileWriter(nSpeakStreamAsMp3, nWavFileReader.WaveFormat, LAMEPreset.STANDARD_FAST)) { // 将WAV数据复制到MP3写入器 nWavFileReader.CopyTo(nMp3Writer); // 关键步骤1:刷新MP3写入器的缓冲,确保所有数据都写入内存流 nMp3Writer.Flush(); // 关键步骤2:把内存流的位置指针重置到起始处,这样后续复制能读取到全部数据 nSpeakStreamAsMp3.Position = 0; string sPath = "C:\\inetpub\\wwwroot\\server\\bin\\mymp3.mp3"; using (FileStream nFile = new FileStream(sPath, FileMode.Create, System.IO.FileAccess.Write)) { // 将完整的MP3内存流写入文件 nSpeakStreamAsMp3.CopyTo(nFile); } }
额外注意点
- 如果你用的是NAudio.Lame包(
LameMP3FileWriter的常见来源),虽然using块在释放写入器时会自动Flush,但显式调用Flush()能避免一些边界场景的问题。 - 还要确保原始的
nSpeakStream(WAV流)的Position也是正确的——如果之前读取过这个流,记得先把它重置到0,否则WaveFileReader可能读不到任何数据,最终MP3流还是空的。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

