国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

IOS開發(fā)Q&A-IOS8定位應(yīng)用定位失敗及音頻錄制的相關(guān)參數(shù)

2019-11-14 19:04:06
字體:
供稿:網(wǎng)友

一、

問題描述:使用xcode6和ios8開發(fā)定位應(yīng)用時,發(fā)現(xiàn)執(zhí)行操作之后,不會調(diào)用到定位之后的delegate方法中。查看了一下手機(jī)上對應(yīng)用的定位權(quán)限界面,發(fā)現(xiàn)我的應(yīng)用的訪問用戶的地理位置的權(quán)限是空的,即使設(shè)置了定位權(quán)限依然不會生效。當(dāng)查閱了相關(guān)資料以后,得到如下解決方案:

解決方案:

step1:

在 info.plist里加入:
NSLocationWhenInUseDescription,允許在前臺獲取GPS的描述
NSLocationAlwaysUsageDescription,允許在后臺獲取GPS的描述

最終如下圖所示:

 

 

step2:

1.@interface里:
CLLocationManager *locationManager;
2. 初始化:
locationManager = [[CLLocationManager alloc]init];
3. 調(diào)用請求:
// 判斷是否iOS8
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
[self.locationManagerrequestAlwaysAuthorization]; // 永久授權(quán)
[self.locationManagerrequestWhenInUseAuthorization]; //使用中授權(quán)
}
[self.locationManager startUpdatingLocation];

添加以上內(nèi)容之后即可以進(jìn)行定位服務(wù),百度地圖和高德地圖測試可用。


參考資料&擴(kuò)展閱讀

http://stackoverflow.com/questions/24062509/location-services-not-working-in-ios-8

http://stackoverflow.com/questions/24874997/core-location-not-working-in-ios-8

 

二、

問題描述:最近要開發(fā)一個類似微信的demo,需要支持用戶語音對話,這個客戶端有IOS版本和Android版本,要完成語音通信功能,在網(wǎng)上看了下資料,類似這類產(chǎn)品使用的技術(shù),talkboxAndroid版用的是ilbc的第三方編解碼庫,在iPhone上用的是caf。微信Android版估計是amr估計轉(zhuǎn)碼的是交給騰訊強(qiáng)大的服務(wù)器了;米聊Android版和Iphone版用的都是speex。目前支持的開源第三方庫有:libopencore_amr,ilbc和speex。

解決方案:

這里我采用libopencore_amr。此庫可AMR和WAV音頻格式的互轉(zhuǎn),實現(xiàn)使用iphone錄制wav格式,轉(zhuǎn)成amr格式和amr轉(zhuǎn)wav。以便和安卓進(jìn)行語音聊天。支持architecture i386, x86_64, armv7, armv7s, arm64。

主要思路:

實現(xiàn)過程是先錄制WAV,然后再轉(zhuǎn)AMR,然后發(fā)送給Andriod。接收時再把AMR格式轉(zhuǎn)WAV然后播放。

step1.錄制WAV,參考了官方的SpeakHere范例

IOS提供的AVFoundation框架可以實現(xiàn)大部分系統(tǒng)聲音服務(wù)不支持的超過30秒的音頻播放功能,同時還提供了錄音功能。而我們主要使用到的是AVAudioRecorder與AVAudioPlayer兩個類,通過名字我們就可以判斷出,前者是提供音頻錄制服務(wù)而后者則是提供播放服務(wù)。AVAudioRecorder以各種不同的格式將聲音錄制到內(nèi)存或設(shè)備本地文件中。錄音過程可再應(yīng)用程序執(zhí)行其他功能時持續(xù)進(jìn)行。而AVAudioPlayer能夠播放任意長度的音頻。使用這個類可以實現(xiàn)游戲配樂和其他復(fù)雜的音頻應(yīng)用程序。可以全名控制播放過程,包括同時播放多個音頻文件等。無疑IOS提供的音頻服務(wù)是強(qiáng)大以及便利的。再使用AVFoundation框架之前必須要將AVFoundation.framework與CoreAudio.framework加入到項目中,再導(dǎo)入兩個接口文件。

#import<AVFoundation/AVFoundation.h>

#import<CoreAudio/CoreAudioTypes.h>

具體的使用實例代碼如下,首先是音頻錄制的使用方法:

 

然后是播放音頻的部分:

 

現(xiàn)在我我們來詳細(xì)解讀一下者兩段代碼的含義,首先是音頻錄制的代碼,我們先后聲明并且定義了一下幾樣?xùn)|西,創(chuàng)建音頻的參數(shù)鍵值對MyRecordParam,一個路徑數(shù)組pathArray,一個Docment路徑字符串DocmentPath以及我們這一步的主角AVAudioRecorder對象MyRecorder。

我們先來解釋一下路徑的獲取,至于音頻參數(shù),重頭戲需要放在后面不是么~

NSSearchPathForDirectoriesInDomains是IOS中一個搜索路徑的方法,它三個參數(shù)前兩個為枚舉,而最后一個參數(shù)為BOOL類型,第一個參數(shù)的枚舉列表如下:

enum{

NSapplicationDirectory= 1,//Supported applications (/Applications)

NSDemoApplicationDirectory,//Unsupportedapplications and demonstration versions

NSDevelOperapplicationDirectory,//Developerapplications (/Developer/Applications)

NSAdminApplicationDirectory,//Systemand network administration applications

NSLibraryDirectory,//Varioususer-visible documentation, support, and configuration files (/Library)

NSDeveloperDirectory,//Developerresources (/Developer)

NSUserDirectory,//Userhome directories (/Users)

NSDocumentationDirectory,//

NSDocumentDirectory,//

NSCoreServiceDirectory,//Locationof core services (System/Library/CoreServices)

NSAutosavedInformationDirectory= 11,//Location of user’s autosaved documents Library/Autosave Information

NSDesktopDirectory= 12,//

NSCachesDirectory= 13,//Location of discardable cache files (Library/Caches)

NSApplicationSupportDirectory= 14,//Location of application support files (Library/Application Support)

NSDownloadsDirectory= 15,//

NSInputMethodsDirectory= 16,//

NSMoviesDirectory= 17,//

NSMusicDirectory= 18,//

NSPicturesDirectory= 19,//

NSPRinterDescriptionDirectory= 20,//

NSSharedPublicDirectory= 21,//

NSPreferencePanesDirectory= 22,//

NSItemReplacementDirectory= 99,//

NSAllApplicationsDirectory= 100,//

NSAllLibrariesDirectory= 101//

};

其每一項代表一種希望獲取到的目錄類型,這其中不只是IOS中的目錄類型,也有MAC下的路徑類型,沒錯,就跟你想的一樣,這個函數(shù)并非IOS下專用。

第二個參數(shù)的枚舉列表如下

enum{

NSUserDomainMask= 1,//用戶主目錄中

NSLocalDomainMask= 2,//當(dāng)前機(jī)器中

NSNetworkDomainMask= 4,//網(wǎng)絡(luò)中可見的主機(jī)

NSSystemDomainMask= 8,//系統(tǒng)目錄,不可修改(/System)

NSAllDomainsMask= 0x0ffff,//全部

};

第二個參數(shù)代表要搜索路徑的位置,本機(jī)?亦或是當(dāng)前程序,還是局域網(wǎng)連接到的其他電腦。

第三個參數(shù)是一個BOOL值他代表是否將返回完整路徑

而返回的路徑中并不包含文件名,我們一定要記住再路徑結(jié)尾處加上我們想要的文件名,別忘了我們是要創(chuàng)建一個音頻文件。

當(dāng)然此函數(shù)搜索的結(jié)果可能又很多條路徑,因為根據(jù)你的參數(shù)不同他返回的路徑甚至可能包含其他電腦上的(具體本人未測,有心人可進(jìn)一步測試,也希望其講結(jié)果與大家分享)所以他的結(jié)果是一個數(shù)組,而我們要取得的路徑目的極為明確,就是程序的Docment路徑,并且可以更加肯定是我們的程序只有一個Docment路徑,所以我們直接取得了第一條返回記錄。

不得不說的是AVAudioRecorder的設(shè)計者是個好人,沒錯,他沒有將構(gòu)造函數(shù)的參數(shù)設(shè)置成一大堆參數(shù),那讓人看起來頭疼,但其實他用了一個更加讓人頭疼的方法,沒錯他讓你去手動設(shè)置一個參數(shù)鍵值對,你甚至不知道建值對中該填什么參數(shù),哪些參數(shù)…這對于習(xí)慣看參數(shù)列表直接調(diào)用方法的人無疑是個噩夢(尤其是當(dāng)他們英文文檔閱讀能力低下時--),目前我所掌握的參數(shù)鍵的相關(guān)資料如下:

AVSampleRateKey,//采樣率

AVFormatIDKey,//音頻編碼格式

AVLinearPCMBitDepthKey,//采樣位數(shù) 默認(rèn)16

AVNumberOfChannelsKey,//通道的數(shù)目

AVLinearPCMIsBigEndianKey,//大端還是小端 是內(nèi)存的組織方式

AVLinearPCMIsFloatKey,//采樣信號是整數(shù)還是浮點數(shù)

AVEncoderAudioQualityKey,//音頻編碼質(zhì)量

鑒于考慮到可能各位看官對于我們所要給出的參數(shù)并不了解,所以在此我們來依次解釋一下每一個參數(shù)的含義

首先是采樣率,簡單地說就是通過波形采樣的方法記錄1秒鐘長度的聲音,需要多少個數(shù)據(jù)。44KHz采樣率的聲音就是要花費44000個數(shù)據(jù)來描述1秒鐘的聲音波形。原則上采樣率越高,聲音的質(zhì)量越好。

編碼格式可以理解為每種音頻格式不同的編解碼方式,鄙人對于此了解的也不是非常多(能熟知所有編解碼的人一定是偶像級的超人!)而IOS下這些編碼方式被集中到一個枚舉中,而我們本次代碼中所使用的編碼格式是WAV文件的格式,想要使用其他的編碼格式就在成功導(dǎo)入AVFouncation框架之后即可通過Xcode的自動提示找到以kAudioFormat開頭的各種枚舉的名稱。

采樣位數(shù)即采樣值或取樣值,是用來衡量聲音波動變化的參數(shù),是指聲卡在采集和播放聲音文件時所使用數(shù)字聲音信號的二進(jìn)制位數(shù)。聲卡的位客觀地反映了數(shù)字聲音信號對輸入聲音信號描述的準(zhǔn)確程度。

通道數(shù)目應(yīng)該很好理解了,1意味著單聲道聲音,2指立體聲,4是指四個聲道等等。

接下來的AVLinearPCMIsBigEndianKey是指再內(nèi)存中音頻的存儲模式,在計算機(jī)中,通常采用的字節(jié)存儲機(jī)制主要有兩種:big-endian和little-endian,即大端模式和小端模式。這個參數(shù)為BOOL值,YES為大端,NO為小端。關(guān)于大端和小端相關(guān)到兩個關(guān)鍵詞,MSB以及LSB。MSB:MostSignificant Bit( 最高有效位),LSB:LeastSignificant Bit (最低有效位)你可以理解為一段數(shù)據(jù)再內(nèi)存中的起始位置以及終止位置,大端模式就是MSB存放在最低端的地址上。而小端口模式就是LSB存放在最低端的地址上。

在Big-Endian中,對于bit序列中的序號編排方式如下(以雙字節(jié)數(shù)0x8B8A為例):
bit | casino 01 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
——MSB———————————-LSB
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
——————————————–

在Little-Endian中,對于bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙字節(jié)數(shù)0x8B8A為例):

bit| 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
——MSB———————————–LSB
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
———————————————

總之可以理解為在內(nèi)存中正反兩種存儲順序。

對于采樣信號是整數(shù)還是浮點數(shù)也是一個BOOL類型的參數(shù),本人并未理解會影響到的含義,或許是設(shè)計到音頻信號再解析時候的精準(zhǔn)度但并不敢確定還有待設(shè)定,所以也沒有設(shè)置這個參數(shù)。

最后一個參數(shù)音頻編碼質(zhì)量比較好理解了,這個參數(shù)又是一個枚舉,我們可以找到以AVAudioQuality開頭的High、Low、Medium、Max、Min五種設(shè)置。介于參數(shù)鍵值對的解釋暫時就是這些了,如果又看官得到了一些其他參數(shù)的資料或者對于我的解釋有糾正補(bǔ)充的歡迎指教。

 

AVAudioRecorder構(gòu)造函數(shù)中的最后一個參數(shù)為一個出參,用以保存音頻錄制的錯誤信息,如果不想保存錯誤的信息直接設(shè)置為空即可

接下來我們的AVAudioRecorder對象好像看起來成功創(chuàng)建完成了,慢著,不對,為什么會提示錯誤?仔細(xì)看一下,原來是路徑的問題,別擔(dān)心,其實只是AVAudioRecorder跟你開了個小玩笑,因為他實在太懶了,都懶得把字符串路徑轉(zhuǎn)換成URL了,所以我們得手動轉(zhuǎn)換一下~沒錯使用NSURL的靜態(tài)方法urlWithString即可解決~接下來只要調(diào)用record方法即可開始錄音。而以上代碼只是實例,建議在編寫程序的時候,我們的AVAudioRecorder對象要聲名在類內(nèi)屬性中。否則需要結(jié)束錄音時無法調(diào)用到AVAudioRecorder的stop方法。

AVAudioRecorder對象創(chuàng)建起來或許會比較麻煩,但是使用起來確很方便,只要再錄音開始時調(diào)用record,暫停的時候調(diào)用pause方法,而結(jié)束的時候調(diào)用stop方法就可以了。

相對于錄音,播放音頻可以說簡單的可以,我們在創(chuàng)建AVAudioPlayer對象的時候只需要將之前錄音的文件路徑給它并且給一個空的錯誤出參便可輕松的創(chuàng)建出一個AVAudioPlayer對象,使用起來也是那么的方便只要調(diào)用一下play函數(shù)即可~~~他和AVAudioRecorder一樣也可以提供暫停和停止的功能,那它是否可以支持進(jìn)度調(diào)節(jié)呢?想知道的話不如用自動提示打開他的方法列表看看呢~一切看起來好像都很簡單,我們就要輕松愉快的大功告成了,可當(dāng)你運行程序之后卻驚奇的發(fā)現(xiàn)為什么播放不出聲音!使用iTools一類的軟件檢查一下程序的Docment目錄,沒錯啊!文件在啊~,莫非我錄制錯了?等等等等上萬種可能就這樣出現(xiàn)在你的腦中!好吧我真不忍心看你像我一樣沒頭沒腦的研究幾個小時只是因為你沒有把實例代碼中AVAudioPlayer的聲明放到類屬性中。。。沒錯,如果你再某個方法中聲明了它并且調(diào)用播放函數(shù)你就會發(fā)現(xiàn)怎么樣也播放不出聲音,如果你在調(diào)用play方法的位置設(shè)置下斷點再仔細(xì)聽的話可能會聽到一小段聲音,為什么呢?因為你剛調(diào)用了play的方法你的AVAudioPlayer對象就被釋放了,當(dāng)然什么也沒有了也就播放不出聲音了~使用AVAudioPlayer就把它的對象放入類內(nèi)屬性吧!

 

這部分轉(zhuǎn)自http://cvito.net/index.php/archives/854                         

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀集县| 巴中市| 卓资县| 临清市| 南开区| 阿尔山市| 太湖县| 德清县| 乌拉特前旗| 万盛区| 华坪县| 永州市| 科尔| 镇宁| 积石山| 呼伦贝尔市| 开封县| 靖安县| 河池市| 越西县| 东安县| 浦城县| 隆尧县| 牟定县| 绵竹市| 太康县| 建湖县| 邢台市| 海南省| 定州市| 杨浦区| 绵竹市| 玛纳斯县| 绵竹市| 察隅县| 茶陵县| 龙海市| 苍山县| 克什克腾旗| 区。| 惠州市|