// 将pcm存为wav文件
- (NSString *) getAndCreatePlayableFileFromPcmData{
NSArray *arrDocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentPath = [arrDocumentPaths objectAtIndex:0];
NSString *dirFilePath = [documentPath stringByAppendingPathComponent:@"audio"];
// 注意这里必须要有这个文件夹,下面存储音频时才不会报错
if (![[NSFileManager defaultManager] fileExistsAtPath:dirFilePath]) {
[[NSFileManager defaultManager] createDirectoryAtPath:dirFilePath withIntermediateDirectories:YES attributes:nil
error:NULL];
}
NSDate *date = [NSDate date];
NSString *fileName = [NSString stringWithFormat:@"iOS_%@.wav",[self.dateFormatter stringFromDate:date]];
NSString *wavFilePath = [dirFilePath stringByAppendingPathComponent:fileName];
short NumChannels = 1; //录音通道数
short BitsPerSample = 16; //线性采样位数
int SamplingRate = 16000; //录音采样率(Hz)
int numOfSamples = (int)self.recordedData.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;
const char *wavFilePathChar = [wavFilePath cStringUsingEncoding:NSUTF8StringEncoding];
@synchronized (self) {
FILE *fout = fopen(wavFilePathChar, "w");
if(fout == NULL){
return nil;
}
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;
handle = [NSFileHandle fileHandleForUpdatingAtPath:wavFilePath];
[handle seekToEndOfFile];
// self.recordedData 为需要保存的pcm数据
[handle writeData:self.recordedData];
[handle closeFile];
return wavFilePath;
}
}
iOS PCM音频数据转wav
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 参考 PCM音频采样数据处理https://blog.csdn.net/leixiaohua1020/articl...
- 因为正好之前写过 Aduio Unit 的一些应用例子(包括录音、播放PCM、播放MP3|AAC,混音等),这里不...
- 我上篇文章有交大家如何编译Opus库 不多说直接贴代码了 使用方法 首先 使用audioqueue 来录制音频数...
- 接下来会分为一下几点来介绍: 基础知识准备 音频开发经常遇到的专业性词语 (1) 采样率 “音频采样率” 是指录音...