I had never done audio programming before I started my iPhone programming. After starting iPhone programming, I started to learn CoreAudio Framework, Audio Unit for Mac OS X system and iPhone System, and largest problem is which audio format should I choose for best practice?
After iPhone OS 3.0 beta was released, Apple finally introducedAVAudioRecorder class to AVFoundation framework. With which, we can play and record audio more efficiently! For me, I can cut the original playback code down from 400+ lines to 20 lines. And for recording, cut down from 300+ lines to 30 lines.
When testing AVAudioRecorder, the file format will significantly effect the file size. I had tried all the available data format when packed with .CAF file. Here is the result:
[Updated@2009-05-25] YES, we can record with this format on simulator, but we CANNOT record this on the device! Remember this. While another one we can refer to is Apple’s official QA1615
[Updated@2009-06-15] Please do not use AAC if you want to play a system sound.
[Updated@2009-09-30] iPhone 3GS support AAC recording since iPhone OS 3.1 was released on Sept 9th. You can use hardware assisted encoding to record the AAC formatted audio file. But let me remind you, you can notuse AVAudioRecord to record AAC audio file yet. The only option is using the RemoteIO Unit.
- kAudioFormatLinearPCM = ‘lpcm’, OK 20.2M .CAF
- kAudioFormatAppleIMA4 = ‘ima4′, OK 2.7M .CAF[Best Choice]
- kAudioFormatMPEG4AAC = ‘aac ‘, OK 968K .CAF[Updated 2009-05-25], [Updated 2009-09-30] Best Choice for iPhone 3GS
- kAudioFormatMACE3 = ‘MAC3′, NG .CAF
- kAudioFormatMACE6 = ‘MAC6′, NG .CAF
- kAudioFormatULaw = ‘ulaw’, OK 5.1M .CAF
- kAudioFormatALaw = ‘alaw’, OK 5.1M .CAF
- kAudioFormatQDesign = ‘QDMC’, NG .CAF
- kAudioFormatQDesign2 = ‘QDM2′, NG .CAF
- kAudioFormatQUALCOMM = ‘Qclp’, NG .CAF
- kAudioFormatMPEGLayer1 = ‘.mp1′, NG .CAF
- kAudioFormatMPEGLayer2 = ‘.mp2′, NG .CAF
- kAudioFormatMPEGLayer3 = ‘.mp3′, NG .CAF
- kAudioFormatAppleLossless = ‘alac’ OK 4M .CAF
- kAudioFormatMPEG4AAC_LD = ‘aacl’, NG .CAF
- kAudioFormatAMR = ‘samr’, NG .CAF
- kAudioFormatiLBC = ‘ilbc’, NG Wierd .CAF
The list here has omitted all the other data format that are not supported by CAF file extension. You can use the console application afconvert to verify each supported file format and data format via typing this:
afconvert -h
All the tests were recorded in 60 seconds, with sample rate@44100, 2 channels, 96kbps. The RecordSetting Dictionary object is used as below:
recordSetting = [[NSMutableDictionary alloc] init];
//General Audio Format Settings (Necessary for all audio format.)
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AACkAudioFormatAppleIMA4] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
//Linear PCM Format Settings (only necessary when you want to record Liner PCM format)
[recordSetting setValue:[NSNumber numberWithInt: 32] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
//Encoder Settings (Only necessary if you want to change it.)
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[recordSetting setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey];
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];
//Sample Rate Conversion Settings (Only necessary when you want to change the sample rate to a value different to the hardware sample rate, AVAudioQualityHigh means no conversion, usually, 44.1KHz)
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVSampleRateConverterAudioQualityKey];
[Updated 2009-09-30], The record settings listed above was for example only, if you want to record IMA4 or other compressed audio format, you are no need to put the Liner PCM part. Other parts are commented for their purpose.
You can see, the MPEG4AAC has the minimum file size and same quality when compare to other file formats. About the AAC format, please refer to [Wikipedia – AAC"]
Apple, you could just give us a best practice guide! So I won’t need to test it one by one myself. OK, I know, you are working out of people, hire me, I would love to do these works.
本文深入探讨了使用AVAudioRecorder进行高效iPhone音频录制的最佳实践,包括选择合适的音频格式、优化录制设置以及解决设备录制限制等问题。通过对比不同音频格式的文件大小,推荐了MPEG4AAC作为iPhone3GS的首选格式,提供了录制设置示例,并讨论了AAC格式的使用注意事项。
206

被折叠的 条评论
为什么被折叠?



