使用音频文件服务写入32位浮点Wav文件

使用音频文件服务写入32位浮点Wav文件,wav,audiotoolbox,audioformat,Wav,Audiotoolbox,Audioformat,我试图通过使用Xcode和AudioFileServices将一些原始PCM值写入WAV文件来保存它们,但是我很难只将一个简单的正弦波写入该文件 这是我的密码: // Set up output file AudioStreamBasicDescription outputFormat = {0}; outputFormat.mSampleRate = 44100; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mBit

我试图通过使用Xcode和AudioFileServices将一些原始PCM值写入WAV文件来保存它们,但是我很难只将一个简单的正弦波写入该文件

这是我的密码:

// Set up output file
AudioStreamBasicDescription outputFormat = {0};
outputFormat.mSampleRate = 44100;
outputFormat.mFormatID = kAudioFormatLinearPCM;
outputFormat.mBitsPerChannel = 32;
outputFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
outputFormat.mFramesPerPacket = 1;
outputFormat.mChannelsPerFrame = 1;
outputFormat.mBytesPerFrame = 4;
outputFormat.mBytesPerPacket = 4;

AudioFileID outputFile;
CFURLRef outputFileURL =
CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("output.wav"), kCFURLPOSIXPathStyle, FALSE);
CheckError(AudioFileCreateWithURL(outputFileURL, kAudioFileWAVEType, &outputFormat, kAudioFileFlags_EraseFile, &outputFile), "Could not open output File");
CFRelease(outputFileURL);

Float32 duration = 3.0;
Float32 freq = 261.37;
Float32 amplitude = 0.3;
UInt32 sizeOfBuffer = (UInt32)(outputFormat.mSampleRate*duration)*sizeof(Float32);
Float32 *audioBuffer = (Float32*)malloc(sizeOfBuffer);
printf("Creating Buffer.... \n");
for (int i = 0; i<(int)(outputFormat.mSampleRate*duration); i++)
    audioBuffer[i] = amplitude*sinf(i*freq/outputFormat.mSampleRate*2*M_PI);

printf("Writing to File.... \n");
// Write to Output File
CheckError(AudioFileWriteBytes(outputFile, FALSE, 0, &sizeOfBuffer, &audioBuffer), "Could not write bytes to file");

printf("Write Succesful!\n");
CheckError(AudioFileClose(outputFile), "Could not close file");
//设置输出文件
AudioStreamBasicDescription outputFormat={0};
outputFormat.mSampleRate=44100;
outputFormat.mFormatID=kAudioFormatLinearPCM;
outputFormat.MbitsPerCannel=32;
outputFormat.mFormatFlags=kAudioFormatFlagIsFloat | kaudioFormatFlagIsPackaged;
outputFormat.mFramesPerPacket=1;
outputFormat.mChannelsPerFrame=1;
outputFormat.mBytesPerFrame=4;
outputFormat.mBytesPerPacket=4;
音频文件ID输出文件;
CFURLRef输出文件URL=
cfurlCreateWithFileSystemPassport(kcfFallocatorDefault,CFSTR(“output.wav”),kCFURLPOSIXPathStyle,FALSE);
检查错误(AudioFileCreateWithURL(outputFileURL、kAudioFileWAVEType和outputFormat、kAudioFileFlags\u擦除文件和outputFile),“无法打开输出文件”);
CFRelease(outputFileURL);
持续时间=3.0;
Float32 freq=261.37;
浮动幅度=0.3;
UInt32 sizeOfBuffer=(UInt32)(outputFormat.mSampleRate*持续时间)*sizeof(Float32);
Float32*audioBuffer=(Float32*)malloc(sizeOfBuffer);
printf(“创建缓冲区…”\n);

for(int i=0;i回答了我自己的问题。当使用
AudioFileWriteBytes
时,我正在传递
&audioBuffer
,而我本应该传递
audioBuffer
,因为它已经是一个指针了

以下是正确的代码:

// Set up output file
AudioStreamBasicDescription outputFormat = {0};
outputFormat.mSampleRate = 44100;
outputFormat.mFormatID = kAudioFormatLinearPCM;
outputFormat.mBitsPerChannel = 32;
outputFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
outputFormat.mFramesPerPacket = 1;
outputFormat.mChannelsPerFrame = 1;
outputFormat.mBytesPerFrame = 4;
outputFormat.mBytesPerPacket = 4;

AudioFileID outputFile;
CFURLRef outputFileURL =
CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("output.wav"), kCFURLPOSIXPathStyle, FALSE);
CheckError(AudioFileCreateWithURL(outputFileURL, kAudioFileWAVEType, &outputFormat, kAudioFileFlags_EraseFile, &outputFile), "Could not open output File");
CFRelease(outputFileURL);

Float32 duration = 3.0;
Float32 freq = 261.37;
Float32 amplitude = 0.3;
UInt32 sizeOfBuffer = (UInt32)(outputFormat.mSampleRate*duration)*sizeof(Float32);
Float32 *audioBuffer = (Float32*)malloc(sizeOfBuffer);
printf("Creating Buffer.... \n");
for (int i = 0; i<(int)(outputFormat.mSampleRate*duration); i++)
    audioBuffer[i] = amplitude*sinf(i*freq/outputFormat.mSampleRate*2*M_PI);

printf("Writing to File.... \n");
// Write to Output File
CheckError(AudioFileWriteBytes(outputFile, FALSE, 0, &sizeOfBuffer, audioBuffer), "Could not write bytes to file");

printf("Write Succesful!\n");
CheckError(AudioFileClose(outputFile), "Could not close file");
//设置输出文件
AudioStreamBasicDescription outputFormat={0};
outputFormat.mSampleRate=44100;
outputFormat.mFormatID=kAudioFormatLinearPCM;
outputFormat.MbitsPerCannel=32;
outputFormat.mFormatFlags=kAudioFormatFlagIsFloat | kaudioFormatFlagIsPackaged;
outputFormat.mFramesPerPacket=1;
outputFormat.mChannelsPerFrame=1;
outputFormat.mBytesPerFrame=4;
outputFormat.mBytesPerPacket=4;
音频文件ID输出文件;
CFURLRef输出文件URL=
cfurlCreateWithFileSystemPassport(kcfFallocatorDefault,CFSTR(“output.wav”),kCFURLPOSIXPathStyle,FALSE);
检查错误(AudioFileCreateWithURL(outputFileURL、kAudioFileWAVEType和outputFormat、kAudioFileFlags\u擦除文件和outputFile),“无法打开输出文件”);
CFRelease(outputFileURL);
持续时间=3.0;
Float32 freq=261.37;
浮动幅度=0.3;
UInt32 sizeOfBuffer=(UInt32)(outputFormat.mSampleRate*持续时间)*sizeof(Float32);
Float32*audioBuffer=(Float32*)malloc(sizeOfBuffer);
printf(“创建缓冲区…”\n);
对于(int i=0;i