我正在尝试设置WaveStream,使其使用与传入的mp3数据相同的格式。我通过读取帧来获得该格式,但是当我尝试使用新格式实际创建新转换流时, “AcmNotPossible调用AcmStreamOpen”异常。
这是我尝试设置新格式的地方:
Mp3Frame f = Mp3Frame.LoadFromStream(ms);
WaveFormat targetFormat = new Mp3WaveFormat(f.SampleRate, f.ChannelMode == ChannelMode.Mono ? 1 : 2, f.FrameLength, f.BitRate);
WaveFormatConversionStream conversionStream;
try
{
using (WaveStream blockAlignedStream =
new BlockAlignReductionStream(conversionStream = new WaveFormatConversionStream(targetFormat,
new Mp3FileReader(ms))))
{
using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(blockAlignedStream);
waveOut.Play();
我不确定是否将波形流设置为与mp3数据的格式匹配,是否还需要转换任何内容。
注意:我尝试使用WaveFormatStream.CreatePcmStream,但某些mp3却出现“静态/白噪声”。它们似乎是16位44,100立体声,但被标记为版本1,第1层,与版本1,第3层正确播放相反。
最佳答案
此代码示例似乎来自很久以前。您不需要BlockAlignReductionStream
或WaveFormatConversionStream
,并且应该远离WaveOut
中的函数回调。这足以从内存流中播放:
var reader = new Mp3FileReader(ms)
var waveOut = new WaveOutEvent();
waveOut.Init(reader);
waveOut.Play();