3

我有一个使用自定义编解码器录制的 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)和 NAudio 1.6 版。我对 NAudio 很陌生,但确实有几行播放“标准”WAV(即不使用自定义编解码器的文件)。

4

1 回答 1

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。

于 2012-10-31T12:31:17.610 回答