在 NAudio 中附加 WAV 标头

Posted

技术标签:

【中文标题】在 NAudio 中附加 WAV 标头【英文标题】:Append WAV Header in NAudio 【发布时间】:2015-05-31 03:21:02 【问题描述】:

我正在尝试通过使用“MediaFoundationReaderRT”打开并在其中指定标准设置,以标准速率(48 KHz、16 位、2 个通道)将音频 MP3 文件转换为 WAV。

文件转换为 PCM WAV 后,当我尝试播放 WAV 文件时,它给出了损坏的输出:

选项 1 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]);
WaveChannel32 waveformInputStream = new WaveChannel32(activeStream);

waveformInputStream.Sample += inputStream_Sample;

我注意到,如果我将音频数据读入内存流(其中它通过“WaveFileWriter”附加 WAV 标头),那么一切正常:

选项 2 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]);

MemoryStream memStr = new MemoryStream();
byte[] audioData = new byte[activeStream.Length];
int bytesRead = activeStream.Read(audioData, 0, audioData.Length);
memStr.Write(audioData, 0, bytesRead);

WaveFileWriter.CreateWaveFile(memStr, audioData);

RawSourceWaveStream rawSrcWavStr = new RawSourceWaveStream(activeStream, 
new WaveFormat(48000, 16, 2));
WaveChannel32 waveformInputStream = new WaveChannel32(rawSrcWavStr);

waveformInputStream.Sample += inputStream_Sample;

但是,将整个音频读入内存非常耗时。因此,如上所述,我正在查看“选项 1”。

我正试图弄清楚到底是什么问题。是否缺少 WAV 标头导致问题?

“选项 1”中是否有一种方法可以将 WAV 标头附加到“当前播放”样本数据中,而不是将整个音频数据转换为内存流然后附加标头?

【问题讨论】:

【参考方案1】:

我不太确定您为什么需要这些选项中的任何一个。使用 NAudio 将 MP3 文件转换为 WAV 非常简单:

using(var reader = new MediaFoundationReader("input.mp3"))

    WaveFileWriter.CreateWaveFile("output.wav", reader);

如果您不需要创建 WAV 文件,那么您的工作已经完成 - MediaFoundationReader 已经从它的 Read 方法返回 PCM,因此您可以直接播放它。

【讨论】:

谢谢马克,我正在看的是,一旦 MediaFoundationReader 从其 Read 方法返回 PCM,我想为“当前播放位置”派生“2048 * 4”字节的数据样本。在这种情况下,我是否必须在 MediaFoundationReader 中一次又一次地重新定位并读取该数据? 您可以在播放过程中轻松地在MediaFoundationReader 中重新定位。基类上的 CurrentTime 帮助器使这变得更加容易 所以我想要解码的 PCM 字节对应于“CurrentTime”。在这种情况下,我会将“WaveStream”定位到“CurrentTime”。然后,必须读取解码后的 PCM 帧的最小字节数才能获得解码数据?是“16384 * 4”吗?

以上是关于在 NAudio 中附加 WAV 标头的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 处理后播放 wav 文件

Naudio:如何播放 MP3 和 WAV 文件?

NAudio - wav 的流式字节 [] 使其播放缓慢

NAudio - 读取和写入 Wav 文件

使用 NAudio 将 g722 音频转换为 WAV

使用 NAUDIO 播放 Dialogic ADPCM 音频文件