繁体   English   中英

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

[英]How can I save array of samples as audio file in iPhone?

我有一个声音作为样本数组。 如何将其保存为音频文件?

我检查了 iPhone Core Audio API。 而且我了解如何从麦克风录制和播放音乐。 但我找不到如何做到这一点。

这是一段对我有用的代码。 有关更多信息,您应该查看Core Audio Rough Cuts一书。

#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];           

}

如果您下载http://www.dspdimension.com/technology-licensing/dirac2/的免费版本,您将在示例源代码中找到用于读取和写入音频文件的函数,我不记得是什么格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM