iOS錄音主要通過兩種方式來實現(xiàn):
其一:使用底層的AudioToolbox.framework 、CoreAudioTypes.framework相關(guān)主要類:AudioQueueRef、AudioStreamBasicDescription、AudioQueueBufferRef,此方式的好處是能實現(xiàn)邊錄制邊緩存數(shù)據(jù),在線播放無需等待音頻文件全部下載完成,可以邊緩沖邊播放,提高用戶體驗。另外實現(xiàn)混音、去除回音也得使用底層Api來實現(xiàn)。
AudioStreamBasicDescription recordFormat; ? //音頻流配置
-? (void)initFormat {
? ? recordFormat.mSampleRate=? KDefaultSampleRate;? //采樣率
? ? recordFormat.mChannelsPerFrame = KDefalutChannel; //聲道數(shù)量
? ? //編碼格式
? ? recordFormat.mFormatID = kAudioFormatLinearPCM;
? ? recordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
? ? //每采樣點占用位數(shù)
? ? recordFormat.mBitsPerChannel = KBitsPerChannel;
? ? //每幀的字節(jié)數(shù)
? ? recordFormat.mBytesPerFrame = (recordFormat.mBitsPerChannel / 8) * recordFormat.mChannelsPerFrame;
? ? //每包的字節(jié)數(shù)
? ? recordFormat.mBytesPerPacket = recordFormat.mBytesPerFrame;
? ? //每幀的字節(jié)數(shù)
? ? recordFormat.mFramesPerPacket = 1;
}
其二:使用蘋果的AVFoundation.framework 的相關(guān)主要類:AVAudioSession、AVAudioRecorder
此方式使用起來簡單,容易理解各種參數(shù)配置。
- (NSDictionary *)getAudioSetting{
? ? NSMutableDictionary *dicM = [NSMutableDictionary dictionary];
? ? [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
? ? [dicM setObject:@(ETRECORD_RATE) forKey:AVSampleRateKey];
? ? [dicM setObject:@(2) forKey:AVNumberOfChannelsKey];
? ? [dicM setObject:@(16) forKey:AVLinearPCMBitDepthKey];
? ? [dicM setObject:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
? ? return?dicM;
}
錄音時設(shè)置的編碼通常是kAudioFormatLinearPCM或者kAudioFormatMPEG4AAC,但是發(fā)現(xiàn)一個問題,無論你使用何種編碼,哪怕設(shè)置kAudioFormatMPEGLayer3編碼后錄制的音頻文件在Android端或Chrome瀏覽器端都無法播放?那如何解決呢?
通過錄制pcm編碼的原始音頻,然后通過mp3的轉(zhuǎn)碼庫Lame(demo鏈接:https://github.com/CivelXu/iOS-Lame-Audio-transcoding)轉(zhuǎn)碼成mp3的編碼后再上傳到服務(wù)器,這樣解決了跨端播放的兼容問題。
文件大小如何?
本人測試了一下錄音文件的大小,近30秒鐘的音頻錄音測試,設(shè)備iPhone6s、雙聲道、采樣率11025 、16位。
pcm編碼? :1.3?MB,轉(zhuǎn)換成mp3編碼后的大?。? 109?KB 。(由此推算5分鐘的錄音大致1MB大?。?/p>
如果改成單聲道、采樣率還是11025:
pcm編碼 : 673?KB,轉(zhuǎn)換成mp3編碼后的大小? :85?KB 。
但是單聲道的文件通過Lame轉(zhuǎn)換后發(fā)現(xiàn)實際音頻時長變成了二分之一?這個估計需要修改demo的相關(guān)轉(zhuǎn)碼算法?具體還清楚!