I am trying to add a wav header on top of raw PCM data to make it playable through AVAudioPlayer. But I could not find any solution or source code for iOS using Objective-C / Swift. Although I found this one , but it does not have the correct answer.
But I found a piece of code here that is in C, and also contains some problem. The wav file does not play correctly, which is generated from this code.
I gave the codes below which I have encoded so far.
int NumChannels = AUDIO_CHANNELS_PER_FRAME; short BitsPerSample = AUDIO_BITS_PER_CHANNEL; int SamplingRate = AUDIO_SAMPLE_RATE; int numOfSamples = [[NSData dataWithContentsOfFile:filePath] length]; int ByteRate = NumChannels*BitsPerSample*SamplingRate/8; short BlockAlign = NumChannels*BitsPerSample/8; int DataSize = NumChannels*numOfSamples*BitsPerSample/8; int chunkSize = 16; int totalSize = 36 + DataSize; short audioFormat = 1; if((fout = fopen([wavFilePath cStringUsingEncoding:1], "w")) == NULL) { printf("Error opening out file "); } fwrite("RIFF", sizeof(char), 4,fout); fwrite(&totalSize, sizeof(int), 1, fout); fwrite("WAVE", sizeof(char), 4, fout); fwrite("fmt ", sizeof(char), 3, fout); fwrite(&chunkSize, sizeof(int),1,fout); fwrite(&audioFormat, sizeof(short), 1, fout); fwrite(&NumChannels, sizeof(short),1,fout); fwrite(&SamplingRate, sizeof(int), 1, fout); fwrite(&ByteRate, sizeof(int), 1, fout); fwrite(&BlockAlign, sizeof(short), 1, fout); fwrite(&BitsPerSample, sizeof(short), 1, fout); fwrite("data", sizeof(char), 3, fout); fwrite(&DataSize, sizeof(int), 1, fout);
The file plays too fast, the sound is distorted and only the first 10-20 seconds are played. I think the wav header is not generated correctly (because I can play the same PCM data / buffer using AudioUnit / AudioQueue). So what am I missing in my code? Any help would be greatly appreciated.
Thanks in advance.