You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:51:12