最近在做iOS音頻播放相關(guān)的項(xiàng)目育灸,需要處理聲音的播放快慢同時(shí)不能改變音頻的音調(diào)驰后,這個(gè)倒是簡(jiǎn)單,系統(tǒng)提供了一個(gè)播放類 AVAudioPlay懊烤,設(shè)置聲音的播放速度so easy梯醒, 但是如果要同時(shí)改變播放速度和音調(diào),這個(gè)就無能為力了腌紧。開始研究這方面真實(shí)愁白了我的少年頭茸习。不管咋樣先Google走起,找了白天發(fā)現(xiàn)了一個(gè)SoundTouch的庫(kù)壁肋,略屌吧C++寫的号胚,同時(shí)支持iOS和Android。研究了大概一個(gè)星期浸遗,效果啥的基本沒有太大問題猫胁,不過坑也填了不少啊。
1乙帮、SoundTouch實(shí)時(shí)轉(zhuǎn)碼那叫一個(gè)吃性能的怪獸杜漠,單個(gè)音頻差不多10%CPU左右了,這個(gè)是在采樣11050的情況下察净,提高采樣就更嚇人了驾茴,人家iOS自帶播放庫(kù)基本是0左右,如果真要是采用這種方式電能損耗直接被用戶罵死氢卡,APP估計(jì)就要撲街了锈至。果斷放棄了。
2译秦、又折騰了下峡捡,發(fā)現(xiàn)SoundTouch可以把轉(zhuǎn)換后的數(shù)據(jù)保存為音頻文件击碗,然后再用系統(tǒng)播放器播放,這個(gè)無疑解決了性能和耗電問題们拙,麻蛋轉(zhuǎn)換后的文件也不小啊稍途,要同時(shí)保存源文件以備下次轉(zhuǎn)換,而且轉(zhuǎn)換也挺費(fèi)時(shí)砚婆,一首3分鐘的歌大概要了30S械拍,無法忍受啊啊啊,而且每次修改參數(shù)装盯,還要重新轉(zhuǎn)碼坷虑,撲街,絕對(duì)撲街埂奈,估計(jì)又要?jiǎng)e用戶叼了迄损。其中還發(fā)現(xiàn)轉(zhuǎn)換的文件開始處有一點(diǎn)雜音,一直沒找出來到底是啥原因账磺,只能投機(jī)取巧的把開始部分截掉芹敌,基本對(duì)音頻沒有影響,感覺是轉(zhuǎn)換庫(kù)起始部分空數(shù)據(jù)的影響绑谣。
悲催的事情沒有過去党窜,中途搞了一段時(shí)間其他功能的開發(fā)后拗引,公司決定音頻變速變調(diào)這個(gè)功能要快點(diǎn)上線了借宵。一個(gè)頭兩個(gè)大,麻蛋天昏地暗矾削,天旋地轉(zhuǎn)壤玫,天要亡我。更可恨的是麻蛋Android以前用的播放器就支持變速變調(diào)哼凯,聽說還是Google的親兒子欲间,Google覺得原生的Android播放器不咋地,然后就又寫了一個(gè)放在github上(我不會(huì)告訴你是哪個(gè)断部,你自己去找)猎贴,無疑我的加快腳步啊。
天無絕人之路蝴光,天道酬勤她渴,天天向上...,找了不少的音頻公開庫(kù)蔑祟,終于讓我找到一點(diǎn)線索趁耗,一個(gè)貌似很強(qiáng)大的庫(kù) AudioKit,swift寫的疆虚。曾幾何時(shí)我和它失之交臂苛败,某一天的下午我在找SoundTouch資料時(shí)就已經(jīng)發(fā)現(xiàn)了它满葛,然后還研究了一下,當(dāng)時(shí)發(fā)現(xiàn)這個(gè)庫(kù)的時(shí)候感覺他就是制作音頻的專業(yè)級(jí)LIB罢屈,初略的看了下資料發(fā)現(xiàn)沒有介紹變速變調(diào)的嘀韧,基本是怎么合成啦,怎么制作使用啦缠捌,怎么濾波啦乳蛾,怎么制作立體聲啦巴拉巴巴這些的。雖然條條大路通羅馬鄙币,無疑我繞了地球一周肃叶。最終還是偶然的機(jī)會(huì)我翻了無數(shù)頁的Google后開到了關(guān)于AudioKit里API文檔里的關(guān)鍵詞Rate、Pitch之類十嘿。媽媽啊因惭,終于找到新大陸了。這個(gè)庫(kù)是個(gè)好庫(kù)绩衷,但目前我們的項(xiàng)目還是objc的蹦魔,而且也不想加入swift,這樣會(huì)使安裝包擴(kuò)大好幾M,產(chǎn)品經(jīng)理都不樂意了。好吧自己把需要的部分重寫狭园。
不看源碼不知道制市,一看源碼嚇一跳,原來iOS有另外一套音頻庫(kù)直接支持變速和變調(diào)损俭,我了個(gè)乖乖乖,是鄙人見識(shí)淺薄,引喻失義咆繁,孤陋寡聞,聞所未聞這方面的東東顶籽,好吧我就透露幾個(gè)關(guān)鍵詞玩般,剩下的自己Google腦補(bǔ),AVAudioEngine礼饱,AVAudioUnitTimePitch對(duì)沒錯(cuò)坏为,就是他這個(gè)東東非常強(qiáng)大,強(qiáng)大的AudioKit也是以它為基礎(chǔ)镊绪。
接下來就是開車時(shí)間匀伏,找到了突破口,問題迎刃而解镰吆,火速基本兩天就把新的音頻引擎庫(kù)搞定了帘撰,住要還是因?yàn)橛辛藚⒄詹拍軐懙倪@么快,以前我們使用SoundManager万皿,現(xiàn)在仿照SoundManager一路跟車摧找,暢通無阻核行!
? ? ? 接下來是源代碼, 恩是有準(zhǔn)備的蹬耘,但是目前還不能公開芝雪。我相信大家的能力 Google一下這種樣例代碼多的是啊,如果有遇到什么不好解決的問題可以留言給我哦综苔,大家一起進(jìn)步惩系!