在 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 标头的主要内容,如果未能解决你的问题,请参考以下文章