最近在做iOS音頻播放相關的項目,需要處理聲音的播放快慢同時不能改變音頻的音調,這個倒是簡單,系統提供了一個播放類 AVAudioPlay,設置聲音的播放速度so easy, 但是如果要同時改變播放速度和音調,這個就無能為力了。開始研究這方面真實愁白了我的少年頭。不管咋樣先Google走起,找了白天發現了一個SoundTouch的庫,略屌吧C++寫的,同時支持iOS和Android。研究了大概一個星期,效果啥的基本沒有太大問題,不過坑也填了不少啊。
1、SoundTouch實時轉碼那叫一個吃性能的怪獸,單個音頻差不多10%CPU左右了,這個是在采樣11050的情況下,提高采樣就更嚇人了,人家iOS自帶播放庫基本是0左右,如果真要是采用這種方式電能損耗直接被用戶罵死,APP估計就要撲街了。果斷放棄了。
2、又折騰了下,發現SoundTouch可以把轉換后的數據保存為音頻文件,然后再用系統播放器播放,這個無疑解決了性能和耗電問題,麻蛋轉換后的文件也不小啊,要同時保存源文件以備下次轉換,而且轉換也挺費時,一首3分鐘的歌大概要了30S,無法忍受啊啊啊,而且每次修改參數,還要重新轉碼,撲街,絕對撲街,估計又要別用戶叼了。其中還發現轉換的文件開始處有一點雜音,一直沒找出來到底是啥原因,只能投機取巧的把開始部分截掉,基本對音頻沒有影響,感覺是轉換庫起始部分空數據的影響。
悲催的事情沒有過去,中途搞了一段時間其他功能的開發后,公司決定音頻變速變調這個功能要快點上線了。一個頭兩個大,麻蛋天昏地暗,天旋地轉,天要亡我。更可恨的是麻蛋Android以前用的播放器就支持變速變調,聽說還是Google的親兒子,Google覺得原生的Android播放器不咋地,然后就又寫了一個放在github上(我不會告訴你是哪個,你自己去找),無疑我的加快腳步啊。
天無絕人之路,天道酬勤,天天向上...,找了不少的音頻公開庫,終于讓我找到一點線索,一個貌似很強大的庫 AudioKit,swift寫的。曾幾何時我和它失之交臂,某一天的下午我在找SoundTouch資料時就已經發現了它,然后還研究了一下,當時發現這個庫的時候感覺他就是制作音頻的專業級LIB,初略的看了下資料發現沒有介紹變速變調的,基本是怎么合成啦,怎么制作使用啦,怎么濾波啦,怎么制作立體聲啦巴拉巴巴這些的。雖然條條大路通羅馬,無疑我繞了地球一周。最終還是偶然的機會我翻了無數頁的Google后開到了關于AudioKit里API文檔里的關鍵詞Rate、Pitch之類。媽媽啊,終于找到新大陸了。這個庫是個好庫,但目前我們的項目還是objc的,而且也不想加入swift,這樣會使安裝包擴大好幾M,產品經理都不樂意了。好吧自己把需要的部分重寫。
不看源碼不知道,一看源碼嚇一跳,原來iOS有另外一套音頻庫直接支持變速和變調,我了個乖乖乖,是鄙人見識淺薄,引喻失義,孤陋寡聞,聞所未聞這方面的東東,好吧我就透露幾個關鍵詞,剩下的自己Google腦補,AVAudioEngine,AVAudioUnitTimePitch對沒錯,就是他這個東東非常強大,強大的AudioKit也是以它為基礎。
接下來就是開車時間,找到了突破口,問題迎刃而解,火速基本兩天就把新的音頻引擎庫搞定了,住要還是因為有了參照才能寫的這么快,以前我們使用SoundManager,現在仿照SoundManager一路跟車,暢通無阻!
? ? ? 接下來是源代碼, 恩是有準備的,但是目前還不能公開。我相信大家的能力 Google一下這種樣例代碼多的是啊,如果有遇到什么不好解決的問題可以留言給我哦,大家一起進步!