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

使用NAudio的MediaFoundationEncoder结合Stream时抛出异常

NAudio的MediaFoundationEncoder结合Stream时抛出异常

你遇到的这个问题其实很常见,根源在于MemoryStream的位置指针!当MediaFoundationEncoder.EncodeToMp3把MP3数据写入MemoryStream后,流的当前位置停在了数据的末尾,这时候直接用new Mp3FileReader(stream)去读取,自然会因为从末尾开始读而找不到任何MP3帧,所以抛出了"Invalid MP3 file - no MP3 Frames Detected"这个异常。

只需要在创建Mp3FileReader之前,把MemoryStream的Position重置为0即可解决问题,修改后的代码如下:

ISampleProvider sampleProvider = reader.ToSampleProvider();
var x = new SampleToWaveProvider(sampleProvider);

using (var resampled = new MediaFoundationResampler(x, targetWaveFormat))
using (var stream = new MemoryStream()) // 将MemoryStream也纳入using块,确保资源能正确释放
{
    MediaFoundationEncoder.EncodeToMp3(resampled, stream, 0);
    stream.Position = 0; // 关键步骤:把流的读取位置重置到起始点
    convertedMP3 = new Mp3FileReader(stream);
}

另外要注意一个细节:Mp3FileReader会持有传入的Stream引用,如果后续你还需要使用convertedMP3,要确保对应的MemoryStream不会被提前释放。如果需要长期保留转换后的MP3数据,可以考虑把流的数据复制到一个独立的MemoryStream,或者调整代码结构避免Stream被using块自动释放,比如:

ISampleProvider sampleProvider = reader.ToSampleProvider();
var x = new SampleToWaveProvider(sampleProvider);
MemoryStream mp3Stream = null;

using (var resampled = new MediaFoundationResampler(x, targetWaveFormat))
{
    mp3Stream = new MemoryStream();
    MediaFoundationEncoder.EncodeToMp3(resampled, mp3Stream, 0);
    mp3Stream.Position = 0;
    convertedMP3 = new Mp3FileReader(mp3Stream);
}
// 注意:此时mp3Stream不能被释放,因为convertedMP3依赖它;后续不再使用两者时,要手动释放资源

备注:内容来源于stack exchange,提问作者Aaginor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:43:04