全民K歌iOS端AudioQueue實現耳返功能(項目詳解)

前言

最近一直在做iOS音頻相關技術的項目,期間在官方及網上的資料文檔也學習了很多,當然,iOS平臺中音頻相關技術還是有很多方面的,然後以AudioUnit對耳返功能實現為例子來總結一下自己最近的收穫,同時分享給大家。

技術點使用場景:

唱吧、全民K歌類似音樂項目中的,原唱和伴唱切換功能。

  • 這個當初實現的時候,差點搞殘自己了。弄出來了,也拿來給大家做一個分享。我們團隊面試經常拿這個問開發者。大家有興趣可以學一下。
  • 如果有更好的實現策略和我討論或者想拿源碼和思維導圖資料的, 請關注我然後直接私聊我,備註一下AudioUnit耳返功能實現

AudioUnit耳返功能實現思路

這邊使用AudioUnit錄音,AudioQueue播放

  1. 創建AudioUnit對象,並初始化設置參數等
  2. 創建AudioQueue對象,初始化並設置參數
  3. 在AudioUnit回調方法中獲取到採集到的數據,並將獲取到的數據餵給AudioQueue的容器中,並給它播放

AudioUnit簡介

AudioUnit這個名字取得還是比較形象的,它的主體就是一系列的unit,不同unit能夠實現不同的功能,將一個或多個unit添加到AUGraph(Audio Processing Graph)中,並建立unit之間的連接,音頻數據順次通過各個節點即可完成我們最終需求。

全民K歌iOS端AudioQueue實現耳返功能(項目詳解)

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實現耳返功能(項目詳解)

代碼太長,圖片偷懶

8.AudioQueue的回調

項目代碼獲取

具體實現步驟,如下

全民K歌iOS端AudioQueue實現耳返功能(項目詳解)

具體步驟

有步驟講解視頻以及資料.因為頭條文章沒有地方放.大家可以關注我然後直接私聊我02獲取相關資料!


分享到:


相關文章: