【问题标题】:Receiving "Not a WAVE file - no RIFF header" when creating wave stream from mp3 conversion stream从 mp3 转换流创建波形流时收到“不是 WAVE 文件 - 没有 RIFF 头”
【发布时间】:2018-07-29 18:53:02
【问题描述】:

我正在尝试使用 NAudio 将 mp3 转换为波流。不幸的是,在创建波形阅读器时,我在第三行收到错误 Not a WAVE file - no RIFF header

var mp3Reader = new Mp3FileReader(mp3FileLocation);
var pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader);
var waveReader = new WaveFileReader(pcmStream)

这些流不应该一起正常工作吗?我的目标是将多个 mp3 和 wav 组合成一个流,用于播放和保存到光盘(作为 wav)。

【问题讨论】:

标签: c# .net naudio


【解决方案1】:

我将用我从未使用过 NAudio 的注释作为开头。话虽如此,在他们的 Github 网站上有concatenating audio 的指南。

查看 API 后,您不能直接使用 Mp3FileReader,因为它没有实现 ISampleProvider。但是,您可以改用AudioFileReader

假设您有一个名为files 的要加入的文件名的IEnumerable<string>(又名List 或数组):

var sampleList = new List<ISampleProvider>();

foreach(string file in files)
{
    sampleList.add(new AudioFileReader(file));
}

WaveFileWriter.CreateWaveFile16("outfilenamegoeshere.wav", new ConcatenatingSampleProvider(sampleList));

【讨论】:

  • 似乎有一个警告,所有文件都必须使用相同的采样率、通道数和位深度。否则,您可能必须先对文件进行一些处理(并将它们保存为新文件文件?)。
  • CreateWaveFile16 不采用IEnumerable&lt;ISampleProvider&gt;,因此此代码无法编译。如果您想串联ISampleProviders,您可以使用FollowedBy 扩展方法将它们链接在一起。采样率和通道数可能与 MP3 相匹配,因为它们最常见的是 44.1kHz 立体声
  • @MarkHeath 哎呀,我错过了创建 ConcatenatingSampleProvider 对象。
  • 是的,这将适用于有关采样率/通道数的警告。
  • 我的 wav 是相同的样本/通道,但 mp3 是完全不同的文件类型,但它可以与上面的代码一起使用(必须添加 ConcatenatingSampleProvider 部分)。样本/频道的东西必须只有 wav,或者 mp3 转换为 wav,它们会自动匹配第一个 wav?
【解决方案2】:

您不需要第二行和第三行。 Mp3FileReader 将为您转换为 PCM,您可以直接使用像 WaveOutEvent 这样的播放器播放它。要在磁盘上实际生成 WAV 文件,请将其传递给 WaveFileWriter.CreateWaveFile

using(var reader = new Mp3FileReader(mp3FileLocation))
{
    WaveFileWriter.CreateWaveFile(reader);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多