转换振幅回.wav文件(c#)

本文关键字:文件 wav 转换 | 更新日期: 2023-09-27 18:06:13

我所做的是将一个波文件转换为一个短[]数组中的振幅值,如下所示c#中。wav的平均振幅

我修改了值和现在想要转换回。wav格式或字节[]数组,当可以写入字节文件

转换振幅回.wav文件(c#)

void SetShortToBuffer(short val,byte[] outArray,int Offset)
{
    outArray[Offset] = (byte)(val & 0x00FF);
    Offset++;
    outArray[Offset] = (byte)((val >> 8) & 0x00FF);
}
byte[] ConvertShortArray(short[] Data,int Offset,int Count)
{
    byte[] helper = new byte[Count * sizeof(short)];
    int end = Offset+Count;
    int io=0;
    for (int i = Offset; i < end; i++)
    {
        SetShortToBuffer(Data[i], helper, io);
        io+=sizeof(short);
    }
    return helper; 
}

C这不会是一个问题,你可以简单地告诉编译器,你以前声明的短数组现在应该被视为一个字节数组(简单的强制转换),但在unsafe上下文之外的C#中没有这样做之后,我提出了这个代码:)

你可以使用ConvertShortArray函数来获取数据块,如果你的波很大

编辑:

快速和肮脏的波头创建器,未测试

byte[] CreateWaveFileHeader(int SizeOfData, short ChannelCount, uint SamplesPerSecond, short BitsPerSample)
{
    short BlockAlign = (short)(ChannelCount * (BitsPerSample / 8));
    uint AverageBytesPerSecond = SamplesPerSecond * BlockAlign;
    List<byte> pom = new List<byte>();
    pom.AddRange(ASCIIEncoding.ASCII.GetBytes("RIFF"));
    pom.AddRange(BitConverter.GetBytes(SizeOfData + 36)); //Size + up to data
    pom.AddRange(ASCIIEncoding.ASCII.GetBytes("WAVEfmt "));
    pom.AddRange(BitConverter.GetBytes(((uint)16))); //16 For PCM
    pom.AddRange(BitConverter.GetBytes(((short)1))); //PCM FMT
    pom.AddRange(BitConverter.GetBytes(((short)ChannelCount)));
    pom.AddRange(BitConverter.GetBytes((uint)SamplesPerSecond));
    pom.AddRange(BitConverter.GetBytes((uint)AverageBytesPerSecond));
    pom.AddRange(BitConverter.GetBytes((short)BlockAlign));
    pom.AddRange(BitConverter.GetBytes((short)BitsPerSample));
    pom.AddRange(ASCIIEncoding.ASCII.GetBytes("data"));
    pom.AddRange(BitConverter.GetBytes(SizeOfData));
    return pom.ToArray();
}