处理在 NAudio 中为 mp3 内存流设置 WaveFormat
Handle setting up WaveFormat for mp3 memory stream in NAudio
我正在尝试设置 WaveStream,以便它使用与传入的 mp3 数据相同的格式。我通过读取帧来获取格式,但是当我尝试使用新格式我得到一个 "AcmNotPossible calling 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,我得到的是 'static/white noise'。它们似乎是 16 位 44,100 立体声,但被标记为第 1 版第 1 层,而不是正确播放的第 1 版第 3 层。
这段代码示例似乎来自很久以前。您不需要 BlockAlignReductionStream
或 WaveFormatConversionStream
,并且您应该远离 WaveOut
中的函数回调。这应该足以从内存流播放:
var reader = new Mp3FileReader(ms)
var waveOut = new WaveOutEvent();
waveOut.Init(reader);
waveOut.Play();
我正在尝试设置 WaveStream,以便它使用与传入的 mp3 数据相同的格式。我通过读取帧来获取格式,但是当我尝试使用新格式我得到一个 "AcmNotPossible calling 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,我得到的是 'static/white noise'。它们似乎是 16 位 44,100 立体声,但被标记为第 1 版第 1 层,而不是正确播放的第 1 版第 3 层。
这段代码示例似乎来自很久以前。您不需要 BlockAlignReductionStream
或 WaveFormatConversionStream
,并且您应该远离 WaveOut
中的函数回调。这应该足以从内存流播放:
var reader = new Mp3FileReader(ms)
var waveOut = new WaveOutEvent();
waveOut.Init(reader);
waveOut.Play();