前言
最近一直在做iOS音頻相關技術的項目,期間在官方及網上的資料文檔也學習了很多,當然,iOS平臺中音頻相關技術還是有很多方面的,然後以AudioUnit對耳返功能實現為例子來總結一下自己最近的收穫,同時分享給大家。
技術點使用場景:
唱吧、全民K歌類似音樂項目中的,原唱和伴唱切換功能。
- 這個當初實現的時候,差點搞殘自己了。弄出來了,也拿來給大家做一個分享。我們團隊面試經常拿這個問開發者。大家有興趣可以學一下。
- 如果有更好的實現策略和我討論或者想拿源碼和思維導圖資料的, 請關注我然後直接私聊我,備註一下AudioUnit耳返功能實現
AudioUnit耳返功能實現思路
這邊使用AudioUnit錄音,AudioQueue播放
- 創建AudioUnit對象,並初始化設置參數等
- 創建AudioQueue對象,初始化並設置參數
- 在AudioUnit回調方法中獲取到採集到的數據,並將獲取到的數據餵給AudioQueue的容器中,並給它播放
AudioUnit簡介
AudioUnit這個名字取得還是比較形象的,它的主體就是一系列的unit,不同unit能夠實現不同的功能,將一個或多個unit添加到AUGraph(Audio Processing Graph)中,並建立unit之間的連接,音頻數據順次通過各個節點即可完成我們最終需求。
![全民K歌iOS端AudioQueue實現耳返功能(項目詳解)](http://p2.ttnews.xyz/loading.gif)
AudioUnit
1.代碼開始使用AVAudioSession獲取音頻錄製播放權限,並激活
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
2.創建AudioUnit
AudioComponentInstanceNew(_audioComponment, &_audioUint);
3.設置AudioUin
AudioUnitSetProperty(_audioUint,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
1,
&flagOne,
sizeof(flagOne));
AudioUnitSetProperty(_audioUint, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &asbd, sizeof(asbd));
AudioUnitSetProperty(_audioUint, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 1, &cb, sizeof(cb));
4.初始化/Start
AudioUnitInitialize(_audioUint);
AudioOutputUnitStart(_audioUint);
5.創建AudioQueue實例
AudioQueueNewOutput(&_asbd, BufferCallback, (__bridge void * _Nullable)(self), nil, nil, 0, &_audioQueue);
6.初始化音頻緩衝區,這3個音頻緩衝區地址不會改變,往裡面填數據的時候,只是裡面的數據變化而已(官方文檔表明地址不可改變)
//初始化音頻緩衝區
for (int i = 0; i < 3; i++) {
//創建buffer
result = AudioQueueAllocateBuffer(_audioQueue, 2048, &_audioQueueBuffers[i]);
if (result != noErr) {
NSLog(@"creat AudioQueue fail");
}
//初始化
memset(_audioQueueBuffers[i]->mAudioData, 0, 2048);
}
7.AudioUnit回調中處理數據
AudioUnitRender(vc->_audioUint, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList);
使用該函數來講數據填充到我們創建的bufferList中
便於後續處理
![全民K歌iOS端AudioQueue實現耳返功能(項目詳解)](http://p2.ttnews.xyz/loading.gif)
代碼太長,圖片偷懶
8.AudioQueue的回調
項目代碼獲取
具體實現步驟,如下
具體步驟
有步驟講解視頻以及資料.因為頭條文章沒有地方放.大家可以關注我然後直接私聊我02獲取相關資料!
閱讀更多 HhelloC 的文章