在我的应用程序中,我有一些.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 在这里,我该如何解决这个问题?
答案 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
更灵活,可以一步完成。