如何将 8 位无符号 wav 文件转换为 8 位有符号 wav 文件?

Posted

技术标签:

【中文标题】如何将 8 位无符号 wav 文件转换为 8 位有符号 wav 文件?【英文标题】:How can I convert an 8bit unsigned wave file, to an 8bit signed wave file? 【发布时间】:2012-08-18 14:42:34 【问题描述】:

我正在使用 NAudio 和 C# 将波形文件转换为 48,000、8 位、单声道。我将转换后的数据存储在字节数组中。我的代码如下。它工作正常,但是新的波形文件数据是未签名的,我需要它来签名。

WaveFormat target = new WaveFormat(48000, 8, 1);
WaveStream stream = new WaveFileReader(this.FilePath);
WaveFormatConversionStream conv = new WaveFormatConversionStream(target, stream);
this.ConvertedData = new byte[conv.Length];
conv.Position = 0;
conv.Read(this.ConvertedData, 0, Convert.ToInt32(conv.Length));
stream.Dispose();
conv.Dispose();

我试过在数据转换后循环遍历字节数组,每个字节减去128,这是我在这个网站上找到的解决方案。

for (int i = 0; i < end; i++)

    signed = (int)this.ConvertedData[i] - 128;
    this.Data[i] = (byte)signed;

这种方法可行,但不是万无一失的,我相信一定有更好的方法。任何建议将不胜感激。谢谢。

【问题讨论】:

根据这个wav文件格式的描述,当你使用8位时,值只能是无符号的。 sonicspot.com/guide/wavefiles.html "当样本用 8 位表示时,它们被指定为无符号值" 不确定这个网站是否会有所帮助,但它可能会更好地解释你能做什么和不能做什么***.com/questions/11711689/… 【参考方案1】:
WaveFormat target = new WaveFormat(48000, 8, 1);
WaveStream stream =new WaveFileReader(this.FilePath);
WaveFormatConversionStream str = new WaveFormatConversionStream(target, stream);
WaveFileWriter.CreateWaveFile("c:\\converted.wav", str); //or the path of .wav file

尝试改用 WaveFileWriter.CreateFile 方法..

结帐NAudio 这个链接你也可以签出他们有一个 C# 音频库 Alvis.Audio

【讨论】:

【参考方案2】:

我无法评论,所以我不得不“滥用”答案功能:

试试:

Convert.toSByte

它是基于字符串的,但应该可以工作......

http://msdn.microsoft.com/en-us/library/b0hdkwd9.aspx

【讨论】:

【参考方案3】:

如果您只是在寻找一种从无符号字节数组转换为有符号字节数组的更好方法,您可以使用 Buffer.BlockCopy 方法,或尝试使用 sbyte[] signed = (sbyte[])(Array)unsigned 。希望对您有所帮助。

【讨论】:

以上是关于如何将 8 位无符号 wav 文件转换为 8 位有符号 wav 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用缩放有效地将 16 位无符号短转换为 8 位无符号字符?

将 32 位有符号整数转换为 24 位有符号音频数据

如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

Python:如何将 32 位有符号长整数转换为 7 位整数

如何将 wav 音频文件格式(样本宽度)转换为 8 位格式?

将 8 个字节转换为有符号长整数(64 位)