Convert Amplitude BACK to .wav file (C#)

孤者浪人 提交于 2019-12-13 01:53:59

问题


What I have done is converted a wave file to amplitude values in a short[] array as found here Mean amplitude of a .wav in C#

I modified the values and now want to convert back to .wav format or a byte[] array which when can be written to a byte file.


回答1:


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; 
}

In C this would not be an issue, you could simply tell the compiler that your previously declared short array should now be treated as a byte array (simple cast) but after failing to do so in C# outside of unsafe context I came up with this code :)

You can use ConvertShortArray function to get chunks of data in case your wave is large

EDIT:

Quick and dirty wave header creator, not tested

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();
}


来源:https://stackoverflow.com/questions/7145848/convert-amplitude-back-to-wav-file-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!