在 NAudio 中添加 WAV 标头

Posted

技术标签:

【中文标题】在 NAudio 中添加 WAV 标头【英文标题】:Prepend WAV Header in NAudio 【发布时间】:2016-09-05 10:15:07 【问题描述】:

我正在使用 MediaFoundationReader 和 ResamplerDmoStream 将 MP4(音频)文件重新采样到 WAV 到 WaveFormat(16000, 16, 1)。重新采样后,我将流发送到语音 API 进行转录,但 API 失败,因为流不包含 WAV 标头。 如果我将流保存到 WAV 文件(使用 WaveFileWriter),再次读取文件,然后将流发送到 API,那么 API 可以工作,因为流包含 WAV 标头。 有没有办法在 ResamplerDmoStream 重采样后将 WAV 标头添加到流中,以防止耗时的 I/O?

【问题讨论】:

【参考方案1】:

您可以使用WaveFileWriter 写信给Stream。所以在这种情况下,我会写信给MemoryStream,并且必须处理WaveFileWriter 才能正确完成WAV 标头。但是你会得到一个 WAV 文件的内存表示。

需要注意的是,当您处理WaveFileWriter 时,您可能最终会处理MemoryStream,因此我在NAudio 中有一个名为IgnoreDisposeStream 的便利类,您可以将MemoryStream 包裹起来以阻止它获取使用前丢弃。

【讨论】:

感谢您的详细解释。使用 ResamplerDmoStream 在 API 端提供了不一致的结果,所以最终我最终改用了 MediaFoundationResampler。我尝试了 WaveFileWriter.Write,但它需要知道字节数组的长度才能创建适当大小的流,并且 MediaFoundationResampler 不提供长度的 getter。如何从 MediaFoundationResampler 创建适当大小的流?

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

Naudio wav格式问题

在播放 mp3 或 wav 时结合 NAudio Pan 和 JSNet SuperPitch

使用 NAudio 处理后播放 wav 文件

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

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

NAudio - 读取和写入 Wav 文件