使用NAudio播放带有自定义编解码器的WAV

时间:2012-10-31 04:35:51

标签: c# wav codec naudio

我有一个使用自定义编解码器录制的WAV文件。编解码器已安装在我的机器上,WAV文件在我的机器上使用Windows Media播放器正常播放。我正在使用NAudio例程尝试通过一些C#代码播放WAV文件。自定义格式的值看起来很奇怪,但我通过分析WAV文件头仔细检查了它们。这是我用来播放文件的最佳C#代码:

WaveFormat wfOKI = WaveFormat.CreateCustomFormat(WaveFormatEncoding.DialogicOkiAdpcm, 8000, 1, 3000, 48, 3);
WaveStream wsRaw = new WaveFileReader(txtFileName.Text);
wsRaw = WaveFormatConversionStream.CreatePcmStream(wsRaw);    // Line A
wsRaw = new BlockAlignReductionStream(wsRaw);                 // Line B
WaveStream wsOKI = new RawSourceWaveStream(wsRaw, wfOKI);

WaveOut woCall = new WaveOut();
woCall.Init(wsOKI);    // <-- This line gives an error.
woCall.Play();

while (woCall.PlaybackState == PlaybackState.Playing)
{
    System.Threading.Thread.Sleep(300);
}

Init()导致以下错误:NAudio.dll中出现类型为“NAudio.MmException”的未处理异常。附加信息:WaveBadFormat调用waveOutOpen。​​

代码是使用自定义编解码器播放WAV的正确策略吗?我已经尝试了在A行和B行注释掉的所有四种组合(与错误消息没有区别)。

我正在使用Windows 7 64位,Visual Studio 2010专业版(项目设置为x86)和版本1.6的NAudio。我是NAudio的新手,但确实得到了一些“标准”WAV(即没有使用自定义编解码器的文件)。

1 个答案:

答案 0 :(得分:3)

如果你有一个WAV文件,则不需要RawSourceWaveStream。您可以直接播放转换后的流。

var wsRaw = new WaveFileReader(txtFileName.Text);
wsRaw = WaveFormatConversionStream.CreatePcmStream(wsRaw);
WaveOut woCall = new WaveOut();
woCall.Init(wsRaw);
woCall.Play();

此外,如果您使用的是WaveOut,则不应该调用thread.sleep来等待它完成。如果您没有在具有GUI的应用程序中使用它,请尝试使用WaveOutEvent。