當前位置:
首頁 > 最新 > 仿QQ錄音以及振幅動畫實現

仿QQ錄音以及振幅動畫實現

我們盡量的把QQ的錄音功能對應的細節都實現了。。。

本篇實現的功能:

1、封裝AVAudioRecorder以及AVAudioPlayer實現錄音以及播放功能。

2、實現錄音時的振幅動畫。

3、播放時環形進度條和振幅動畫,以及一些零碎的交互細節。

4、變聲效果。

5、發送時錄音文件的路徑,以及取消發送刪除錄音文件細節都做了。。

先上一個效果圖:

抓幾個點說一下:

錄音以及振幅動畫效果的實現思路:

錄音我們自己通過封裝AVRecorder實現。振幅動畫的思路:用固定含有10個元素的數組,來表示當前需要顯示的振幅數值,使用一條貝塞爾曲線畫出當前數組的路徑,在CAShapeLayer上做展示。開始錄音時,啟動一個定時器,不間斷獲取音量的分貝值,定時器任務每進行一次,將數組的最後一個元素刪除,最新的分貝添加到數組第一個位置,然後根據數組重新繪製貝塞爾曲線並做展示。重複進行看起來就像在移動一樣。

步驟:

1、獲取錄音的分貝大小(-160dB -- 0dB ,我們把它轉換成0 - 1)。

- (float)levels {

[self.audioRecorder updateMeters];

double aveChannel = pow(10, (ALPHA * [self.audioRecorder averagePowerForChannel:0]));

if (aveChannel

if (aveChannel >= 1.0f) aveChannel = 1.0f;

return aveChannel;

}

2、開始一個定時器,按照一定的時間從錄音器獲取分貝大小,並將數組按照上面的規則修改。

- (void)updateMeter {

// 獲取分貝數值

CGFloat level = [[CWRecorder shareInstance] levels];

[self.currentLevels removeLastObject];

[self.currentLevels insertObject:@(level) atIndex:0];

// 這個allLevels是用來幹嘛的?(在當前無關)在下面會說明,自有大用

[self.allLevels addObject:@(level)];

// 重繪bezierPath,重新展示

[self updateLevelLayer];

}

3、根據數組,重新描述路徑,並重新展示

- (void)updateLevelLayer {

self.levelPath = [UIBezierPath bezierPath];

CGFloat height = CGRectGetHeight(self.levelLayer.frame);

for (int i = 0; i

CGFloat x = i * (levelWidth + levelMargin) + 5;

CGFloat pathH = [self.currentLevels[i] floatValue] * height;

CGFloat startY = height / 2.0 - pathH / 2.0;

CGFloat endY = height / 2.0 + pathH / 2.0;

[_levelPath moveToPoint:CGPointMake(x, startY)];

[_levelPath addLineToPoint:CGPointMake(x, endY)];

}

self.levelLayer.path = _levelPath.CGPath;

}

做完振幅就動起來了,非常簡單。。。在錄音結束的時候 暫停定時器就OK了.

4、因為QQ錄音的振幅是兩邊對稱的,我們將視圖的層級做了一下小小的調整,在中間加入了一個複製圖層CAReplicatorLayer。直接將展示的圖層旋轉180度複製一份。就有了對稱的兩條振幅。

5、播放錄音時的振幅動畫如何做?

錄音時我們能獲取當前錄音的分貝,但是播放的時候,不能獲取播放的錄音當前分貝(我暫時無力獲取)怎麼辦?我這邊採取的方式就是在錄音的時候把展示過的分貝值都保存起來,就是上面第二塊代碼中的allLevels。。在結束錄音的時候將這個數組保存在一個單例的模型內,播放的時候直接在這個模型內取出該分貝數據,實現方式就是重複步驟2了。

變聲如何實現?

變聲這塊我粗略的實現了一下,使用到了一個第三方框架 SoundTouch

最後。。如果要作為一個真正能使用到聊天內的錄音,錄製的語音格式我們需要從wav轉成amr,有兩點好處,一個是佔有內存小,另外一個是兼容安卓,這個也有一個常用的框架AudioConvert,其他的一些細節就不多說了。。。

想了解的兄弟 可以下載源碼看看

發現什麼bug可以留言給我。。謝謝~

作者:___

鏈接:https://juejin.im/post/5a3bc79ff265da43152415f6

來源:掘金


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Cocoa開發者社區 的精彩文章:

iOS感測器:使用陀螺儀完成一個小球撞壁的小遊戲
西二旗程序員殺人事件
iMac Pro 就是一台「怪獸」,但不適合所有人
iOS圖片載入策略的簡單實現
iOS多線程全面解讀(四):鎖

TAG:Cocoa開發者社區 |