即時通訊收發語音,兼容安卓wav和amr格式互轉

這幾天公司做了一個即時通訊的簡單聊天軟件,要求可以收發文子、圖片、語音。由於公司缺乏socket相關方面的人才,考慮到開發週期,公司最後決定用http定時發送請求的方式實現消息的接受,這種方法雖然不太科學,但是勉強能用。但是實際開發中也是各種蛋疼,這節主要分享一下自己做語音部分遇到的各種蛋疼的事;

剛開始是打算向後臺以二進制流的方式發送給服務器,搞了半天沒發送成功,後來服務器說他們服務器的用的框架只能接受標準的json格式的數據,而json不能存放二進制流格式的數據,所以不能發送成功。沒辦法後來把二進制流轉化爲字符串格式,放在json裏面傳給服務器,服務器才接收到我的數據。

要實現語音聊天,首先要用AVFoundation框架下的AVAudioRecorder類錄製語音,AVAudioRecorder默認的錄製格式是caf的,但是安卓那邊不能播放caf格式,安卓那邊用的是amr格式,但是我不知道怎麼把caf轉爲amr,後來請教朋友知道AVAudioRecorder類錄製的時候把這隻參數裏面的AVFormatIDKey設置成kAudioFormatLinearPCM 可以錄製wav格式,然後通過VoiceConverter開源類(網上很容易找到)可以把wav轉爲amr,然後發給後臺,安卓那邊就可以播放。

理論上是如此,但是實際操作過程中又遇到了好多問題,首先在網上下載VoiceConverter導入工程後,老是報錯,主要是libopencore-amrnb.a這個開源框架的問題,解決辦法是把Build Settings中的Enable Bitcode 設置爲NO,就好了,具體原因不詳。然後調用VoiceConverter.h裏面的兩個方法就可以實現wav和amr的相互轉換。然後把我錄製的wav格式轉化爲amr發送給安卓之後,播放後發現有很大的噪音,我開始使勁的改啊改找原因,後來發現是VoiceConverter.h類中amr轉wav的方法中那個1和16對應的是AVAudioRecorder的設置中的音頻通道數和線性音頻的位深度這兩個參數,要一致,改了之後,iOS和安卓終於可以聽到對方的聲音了。

操,這幾天被代碼操死了。

發佈了45 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章