使用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
相关产品推荐
相关产品推荐

