wav 文件转换 PCM 48kHz/16 比特率到 u-law 8kHz/8 比特率使用 NAudio
wav file conversion PCM 48kHz/16 bit rate to u-law 8kHz/8 bit rate using NAudio
我有一个 wav 文件,需要将其转换为我们的一个应用程序可以读取的格式。我要转换的文件格式为:
- 编码:PCM
- 采样率:48kHz
- 比特率:16 位
- 频道:1
我要转换成的可读文件格式是:
- 编码:u-Law
- 采样率:8kHz
- 比特率:8 位
- 频道:1
为此,我使用了 NAudio 库。我用于转换的代码类似于:
using (WaveFileReader reader = new WaveFileReader(inputWavFilePath))
{
WaveFormat newFormat = WaveFormat.CreateMuLawFormat(8000, 1);
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
{
WaveFileWriter.CreateWaveFile(outputWavFilePath, conversionStream);
}
}
以上转换抛出错误
AcmNotPossible calling acmStreamOpen
我看到了一些从 u-law 转换为 PCM 的链接,但在反向转换时遇到了问题。
我很难理解的是为什么当我转换 PCM/48kHz/16bit
->
uLaw/48kHz/8bit
时没有抛出异常 。但是,当我随后尝试将生成的文件转换为 uLaw/8kHz/8bit
时,抛出异常 .
我是处理音频文件和不同格式的新手,所以如果我遗漏了一些简单的东西,我深表歉意。
有人能解释一下为什么转换仅在采样率转换时抛出异常,而在其他两个转换(编码 PCM -> uLaw
&& 16bit -> 8bit
)中没有抛出异常吗?
我相信我找到了哪些转换以及转换需要按照什么顺序才能正常工作。下面的代码似乎有效。
String inputWav = "D:\test-input.wav";
String tempWav = "D:\test-input-temp.wav";
String outputWav = "D:\test-output.wav";
WaveFormat pcm8k16bit = new WaveFormat(8000, 16, 1);
WaveFormat muLaw8k8bit = WaveFormat.CreateMuLawFormat(8000, 1);
using (var reader = new WaveFileReader(inputWav))
using (var conversionStream = new WaveFormatConversionStream(pcm8k16bit, reader))
{
WaveFileWriter.CreateWaveFile(tempWav, conversionStream);
}
using (var fs = new FileStream(tempWav, FileMode.Open))
using (var rawSrcReader = new RawSourceWaveStream(fs, pcm8k16bit))
using (var conversionStream = new WaveFormatConversionStream(muLaw8k8bit, rawSrcReader))
{
WaveFileWriter.CreateWaveFile(outputWav, conversionStream);
}
问题是我还是想不通为什么会这样。我尝试了许多其他相同和相似代码的安排,但无济于事。例如,为什么从PCM 48kHz/8bit转换成MuLaw 48kHz/8bit时转换失败?
我写了一个 fairly detailed article 来解释如何在 .NET 中的各种音频类型之间进行转换(许多使用 NAudio)
使用 ACM 编解码器,您通常一次只能更改一件事 - 例如
- 更改采样率(例如 48kHz -> 8kHz)
- 更改通道数(例如单声道 -> 立体声)
- 更改位深度(例如 32 位浮点数 -> 16 位整数)
- 使用编解码器编码或解码(例如从 PCM 到 mu-law)
您可以将它们链接在一起以执行两阶段转换 - 例如像这样:
using (var reader = new WaveFileReader(inputWav))
using (var conversionStream1 = new WaveFormatConversionStream(pcm8k16bit, reader))
using (var conversionStream2 = new WaveFormatConversionStream(muLaw8k8bit, conversionStream1))
{
WaveFileWriter.CreateWaveFile(outputWav, conversionStream2);
}
我有一个 wav 文件,需要将其转换为我们的一个应用程序可以读取的格式。我要转换的文件格式为:
- 编码:PCM
- 采样率:48kHz
- 比特率:16 位
- 频道:1
我要转换成的可读文件格式是:
- 编码:u-Law
- 采样率:8kHz
- 比特率:8 位
- 频道:1
为此,我使用了 NAudio 库。我用于转换的代码类似于:
using (WaveFileReader reader = new WaveFileReader(inputWavFilePath))
{
WaveFormat newFormat = WaveFormat.CreateMuLawFormat(8000, 1);
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
{
WaveFileWriter.CreateWaveFile(outputWavFilePath, conversionStream);
}
}
以上转换抛出错误
AcmNotPossible calling acmStreamOpen
我看到了一些从 u-law 转换为 PCM 的链接,但在反向转换时遇到了问题。
我很难理解的是为什么当我转换 PCM/48kHz/16bit
->
uLaw/48kHz/8bit
时没有抛出异常 。但是,当我随后尝试将生成的文件转换为 uLaw/8kHz/8bit
时,抛出异常 .
我是处理音频文件和不同格式的新手,所以如果我遗漏了一些简单的东西,我深表歉意。
有人能解释一下为什么转换仅在采样率转换时抛出异常,而在其他两个转换(编码 PCM -> uLaw
&& 16bit -> 8bit
)中没有抛出异常吗?
我相信我找到了哪些转换以及转换需要按照什么顺序才能正常工作。下面的代码似乎有效。
String inputWav = "D:\test-input.wav";
String tempWav = "D:\test-input-temp.wav";
String outputWav = "D:\test-output.wav";
WaveFormat pcm8k16bit = new WaveFormat(8000, 16, 1);
WaveFormat muLaw8k8bit = WaveFormat.CreateMuLawFormat(8000, 1);
using (var reader = new WaveFileReader(inputWav))
using (var conversionStream = new WaveFormatConversionStream(pcm8k16bit, reader))
{
WaveFileWriter.CreateWaveFile(tempWav, conversionStream);
}
using (var fs = new FileStream(tempWav, FileMode.Open))
using (var rawSrcReader = new RawSourceWaveStream(fs, pcm8k16bit))
using (var conversionStream = new WaveFormatConversionStream(muLaw8k8bit, rawSrcReader))
{
WaveFileWriter.CreateWaveFile(outputWav, conversionStream);
}
问题是我还是想不通为什么会这样。我尝试了许多其他相同和相似代码的安排,但无济于事。例如,为什么从PCM 48kHz/8bit转换成MuLaw 48kHz/8bit时转换失败?
我写了一个 fairly detailed article 来解释如何在 .NET 中的各种音频类型之间进行转换(许多使用 NAudio)
使用 ACM 编解码器,您通常一次只能更改一件事 - 例如
- 更改采样率(例如 48kHz -> 8kHz)
- 更改通道数(例如单声道 -> 立体声)
- 更改位深度(例如 32 位浮点数 -> 16 位整数)
- 使用编解码器编码或解码(例如从 PCM 到 mu-law)
您可以将它们链接在一起以执行两阶段转换 - 例如像这样:
using (var reader = new WaveFileReader(inputWav))
using (var conversionStream1 = new WaveFormatConversionStream(pcm8k16bit, reader))
using (var conversionStream2 = new WaveFormatConversionStream(muLaw8k8bit, conversionStream1))
{
WaveFileWriter.CreateWaveFile(outputWav, conversionStream2);
}