Brandon Trebitowski is the author of iPhone and iPad in Action.
In the past versions of the iPhone SDK, audio recording was a daunting task. It required intimate knowledge of audio processing as well as a lot of code. With the release of the 3.0 SDK, Apple has provided us with a much simpler way of achieving this functionality. All of the classes for recording audio can be found in the AVFoundation framework. In order to use these classes, you must add AVFoundation.framework to your project.
Initializing the Audio Recorder
When initializing a new AVAudioRecorder object, you should avoid using the default constructor init. This is to reduce complexity, as this class requires quite a bit of configuration. The constructor you should is initWithURL:settings:error. It will allow you to specify the location on disk to record the audio to as well as provide various audio settings.
The first parameter is the location where the recording will be stored. Although it is expressed as an NSURL, it is really a local path that points to a location on disk. In most cases, you will want to store recordings in the Documents directory.
The next parameter is an NSDictionary that contains the settings for the recording. Table 1 lists some of the settings that you might want to consider when setting up your recorder.
|AVSampleRateKey||A sample rate, in hertz, expressed as an NSNumber floating-point value.|
|AVFormatIDKey||A pretty common value for this is kAudioFormatAppleLossless|
|AVNumberOfChannelsKey||The number of channels expressed as an NSNumber integer value. We can set this value to 1.|
|AVEncoderAudioQualityKey||A key that refers to the quality of the audio being played.|
There are quite a few other settings that can be specified when creating your recorder. These settings are all optional and all have default values. You can use these settings to fine-tune your audio recording. Listing 1 demonstrates how to build an AVAudioRecorder object with some basic settings.
NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/recording.caf"]; NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithFloat: 44100.0], AVSampleRateKey, [NSNumber numberWithInt: kAudioFormatAppleLossless],AVFormatIDKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,nil]; AVAudioRecorder * soundRecorder = [[AVAudioRecorder alloc] initWithURL: [NSURL fileURLWithPath:filePath] settings: recordSettings error: nil];
One thing we want to point out is the filePath. This is an NSString that points to a file named recording.caf in the documents directory. This path is then converted to an during the construction of the recorder.