如何更改.wav格式的音频文件比特率

时间:2016-11-10 07:40:47

标签: c# .net audio wav naudio

在我的应用程序中,我有一些.wav格式的音频文件,在这里我使用 Naudio dll检查音频文件比特率,如果比特率低于128kbps,那么我想将其更改为128kpbs以上,所以我在下面写了检查比特率的代码,如果它低于128kbps,那么它转换为128kbps以上。

int bitrate;
using (var reader = new WaveFileReader(textBox1.Text))
{
    bitrate = reader.WaveFormat.AverageBytesPerSecond * 8;
    reader.Dispose();
}

if (bitrate < 128000)
{
    using (var reader = new WaveFileReader(textBox1.Text))
    {
     var newFormat = new WaveFormat(8000, 16, 1);
        using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
        {
            WaveFileWriter.CreateWaveFile(@"C:\Docs\Files\", conversionStream);
        }
    }
}

对于某些文件,它工作正常,但对于某些文件,我收到的错误,

  

NAudio.dll中出现未处理的“NAudio.MmException”类型异常       附加信息:AcmNotPossible调用acmStreamOpen

我在这里附加错误Snap。错误Error Snap 在这里,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我建议你看看FFmpeg。这是我用于所有音频/视频转换任务的。

它是一个命令行工具,可以从几乎任何东西转换为任何东西,有很多选项。要做你想做的事,你可能需要运行类似的东西:

$ ffmpeg -i input.wav -ab 128 output.wav

在上面的行中,我们将文件转换为128比特率。

在代码中使用它的最简单方法是在项目中包含FFmpeg可执行文件(或作为环境变量全局安装)并直接使用以下内容调用它:

Process process = new Process();
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.FileName = "ffmpeg";

process.StartInfo.Arguments = $"-i \"{originalFile}\" -ab 128 \"{outputPath}\"";

process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.Start();
process.WaitForExit(); 

还有更优雅的解决方案 - 围绕FFmpeg的包装 - 但这应该可以解决问题。

答案 1 :(得分:0)

WaveFormatConversionStream查找可以执行请求的转换的ACM编解码器。并非所有转型都是可能的。例如,您通常无法一次性更改采样率,位深度和通道数。因此,可能的转换取决于传入音频的确切WaveFormat。您可能需要在一个步骤中进行缩减采样,然后在另一个步骤中从立体声变为单声道。 MediaFoundationResampler更灵活,可以一步完成。