如何在iPhone中将样本数组保存为音频文件?

如何在iPhone中将样本数组保存为音频文件?,iphone,objective-c,core-audio,Iphone,Objective C,Core Audio,我有一个声音样本阵列。 如何将此保存为音频文件 我已经检查了iPhone核心音频API。 我知道如何用麦克风录音和播放音乐。 但是我找不到如何做到这一点。这里有一段代码适合我。欲了解更多信息,请查阅《核心音频粗略剪切》一书 #包括“WavGenerator.h” #进口 #进口 #包括“AudioController.h” #定义采样率44100 #定义持续时间5.0 #定义(x)的计数((sizeof(x)/sizeof(0[x]))/((size_t)(!(sizeof(x)%sizeof(

我有一个声音样本阵列。 如何将此保存为音频文件

我已经检查了iPhone核心音频API。 我知道如何用麦克风录音和播放音乐。
但是我找不到如何做到这一点。

这里有一段代码适合我。欲了解更多信息,请查阅《核心音频粗略剪切》一书

#包括“WavGenerator.h”
#进口
#进口
#包括“AudioController.h”
#定义采样率44100
#定义持续时间5.0
#定义(x)的计数((sizeof(x)/sizeof(0[x]))/((size_t)(!(sizeof(x)%sizeof(0[x]”);)
//#定义文件名@“newFile.caf”
外部无符号整数全局大小;
外部无符号整数全局大小输出;
void createNewWAV(常量字符*位置,int*样本数组){
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSString*filePath=NSTemporaryDirectory();
filePath=[filePath stringByAppendingPathComponent:@“name_of_your_file.wav”];
NSURL*fileURL=[NSURL fileURLWithPath:filePath];
音频流基本描述asbd;
memset(&asbd,0,sizeof(asbd));
asbd.mSampleRate=采样率;
asbd.mFormatID=kaudioformlinearpcm;
asbd.mFormatFlags=KlinearPCFormatFlagIsSignedInteger | KlinearPCFormatFlagIspacked;
//asbd.mFormatFlags=kAudioFormatFlagIsBigEndian;
asbd.mBitsPerChannel=16;
asbd.mChannelsPerFrame=1;
asbd.mFramesPerPacket=1;
asbd.mBytesPerFrame=2;
asbd.mBytesPerPacket=2;
音频文件ID音频文件;
OSStatus audioErr=noErr;
audioErr=AudioFileCreateWithURL((CFURLRef)fileURL,
kAudioFileWAVEType,
&asbd,
kAudioFileFlags_擦除文件,
&音频文件);
断言(audioErr==noErr);
printf(“WAV生成器---全局大小\u输出%d\n”,全局大小\u输出);
输出的整数大小=全局大小输出;
SInt16*样本=(SInt16*)malloc(仪器的全局大小*输出的大小*大小(SInt16));
for(int i=0;i<仪器的全局大小*输出的大小;i++)
{
_samples[i]=样本_数组[i];
}
UInt32 numSamples=仪器的全局大小*输出的大小;
UInt32 bytesToWrite=numSamples;
audioErr=AudioFileWriteBytes(audioFile,false,0和bytesToWrite,_示例);
audioErr=AudioFileClose(audioFile);
断言(audioErr==noErr);
[泳池排水沟];
}

如果您下载的是免费版本的,您可以在示例源代码函数中找到用于读取和写入音频文件的功能,我不记得是什么格式。

您从哪里获得示例?哦,我自己制作的。我用“样本”这个词作为信号序列。抱歉,让您感到困惑。为什么要将样本数组复制到样本数组?
#include "WavGenerator.h"
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#include "AudioController.h"
#define SAMPLE_RATE 44100
#define DURATION 5.0
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))  

// #define FILENAME @"newFile.caf" 

 extern unsigned int global_size_of_instrumental;
 extern unsigned int global_size_output;

 void createNewWAV (const char *location, int *sample_array){    

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *filePath = NSTemporaryDirectory();

filePath = [filePath stringByAppendingPathComponent:@"name_of_your_file.wav"];


NSURL *fileURL = [NSURL fileURLWithPath:filePath];

AudioStreamBasicDescription asbd;


memset(&asbd,0, sizeof(asbd));

asbd.mSampleRate = SAMPLE_RATE;
asbd.mFormatID = kAudioFormatLinearPCM;

asbd.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
// asbd.mFormatFlags = kAudioFormatFlagIsBigEndian;


asbd.mBitsPerChannel = 16;
asbd.mChannelsPerFrame = 1;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 2;
asbd.mBytesPerPacket = 2;



AudioFileID audioFile;

OSStatus audioErr = noErr;

audioErr = AudioFileCreateWithURL((CFURLRef)fileURL, 
                                 kAudioFileWAVEType,   
                                  &asbd,
                                  kAudioFileFlags_EraseFile,
                                  &audioFile);
assert (audioErr == noErr);


printf("WAV GENERATOR  --- global_size_output %d \n", global_size_output);
int size_of_output = global_size_output;

SInt16 *the_samples = (SInt16 *) malloc(global_size_of_instrumental*size_of_output*sizeof(SInt16)); 

for (int i=0; i< global_size_of_instrumental*size_of_output; i++)  
{
    the_samples[i] = sample_array[i];

}



UInt32 numSamples = global_size_of_instrumental*size_of_output;
UInt32 bytesToWrite = numSamples;



audioErr = AudioFileWriteBytes(audioFile, false, 0, &bytesToWrite, the_samples);

audioErr = AudioFileClose(audioFile);
assert(audioErr == noErr);

[pool drain];           

}