用recordedTotalVoiceData 記錄總的data數(shù)據(jù)(用于header的重寫)
每次寫frame之前 重寫header即可
// 將pcm存為wav文件
-
(NSString *) getAndCreatePlayableFileFromPcmData:(BOOL)force :(NSData *)frame{
dispatch_async(self.ioQueue, ^{
short NumChannels = 1; //錄音通道數(shù) short BitsPerSample = 16; //線性采樣位數(shù) int SamplingRate = 16000; //錄音采樣率(Hz) int numOfSamples = (int)self.recordedTotalVoiceData.length; int ByteRate = NumChannels*BitsPerSample*SamplingRate/8; short BlockAlign = NumChannels*BitsPerSample/8; int DataSize = NumChannels*numOfSamples*BitsPerSample/8; int chunkSize = 16; int totalSize = 46 + DataSize; short audioFormat = 1; NSData *ttdata = [NSData dataWithContentsOfFile:self.wavFilePath]; const char *wavFilePathChar = [self.wavFilePath cStringUsingEncoding:NSUTF8StringEncoding]; @synchronized (self->_recordedTotalVoiceData) { FILE *fout = fopen(wavFilePathChar, "r+"); if (ttdata.length == 0) { fclose(fout); fout = fopen(wavFilePathChar, "w"); } if(fout == NULL){ return; } fwrite("RIFF", sizeof(char), 4,fout); fwrite(&totalSize, sizeof(int), 1, fout); fwrite("WAVE", sizeof(char), 4, fout); fwrite("fmt ", sizeof(char), 4, 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), 4, fout); fwrite(&DataSize, sizeof(int), 1, fout); fclose(fout); } NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:self.wavFilePath]; [handle seekToEndOfFile]; // self.recordedData 為需要保存的pcm數(shù)據(jù) @synchronized (self->_recordedTotalVoiceData) { [handle writeData:frame]; }
});
return nil;
}