iOS 錄音與播放以及網(wǎng)絡(luò)音頻播放(原創(chuàng))

公司下個(gè)版本計(jì)劃要做音頻的錄制與播放授帕,這塊沒怎么接觸過,一邊學(xué)習(xí)一邊踩坑浮梢,下面就給大家做個(gè)分享跛十,共同進(jìn)步。這里也貼出我寫的DEMO(代碼使用了鏈?zhǔn)骄幊趟枷腼跸酰彩菍W(xué)習(xí)階段芥映,歡迎指正),歡迎使用和star远豺!

錄音

音頻任務(wù)初始化

我們這里用的是NB的AVFoundation框架奈偏,這里使用AudioSession來(lái)對(duì)音頻任務(wù)做處理,無(wú)論是錄制還是播放都需要做這一步躯护。初始化任務(wù):

AVAudioSession *session = [AVAudioSession sharedInstance];
            NSError *sessionError;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if(session == nil){
    NSLog(@"Error creating session: %@", [sessionError description]);
}else{
    [session setActive:YES error:nil];//激活當(dāng)前session
}

如果不做初始化惊来,直接使用AudioRecorder的話,錄制出來(lái)是沒有任何聲音的棺滞,下面幾點(diǎn)就是原因裁蚁,也是它的主要功能:

1.為app選擇輸入輸出的路由 (通過揚(yáng)聲器還是聽筒播放)

2.協(xié)調(diào)音頻播放的app之間的關(guān)聯(lián)矢渊,以及系統(tǒng)的聲音處理

3.處理被其他apps打斷

4.創(chuàng)建一個(gè)錄音或者播放音樂的任務(wù)

而這里的參數(shù)AVAudioSessionCategoryPlayAndRecord需要說明一下,可以根據(jù)實(shí)際情況選擇:

* AVAudioSessionCategorySoloAmbient 
  會(huì)停止其他程序的音頻播放枉证。當(dāng)設(shè)備被設(shè)置為靜音模式矮男,app也同樣被停止
* AVAudioSessionCategoryRecord
  僅用來(lái)錄音,無(wú)法播放音頻
* AVAudioSessionCategoryPlayback 
 會(huì)停止其它音頻播放刽严,并且能在后臺(tái)播放昂灵,鎖屏and靜音模式下均可
* AVAudioSessionCategoryPlayAndRecord
  能播也能錄,播放默認(rèn)聲音是從聽筒出來(lái)
* AVAudioSessionCategoryAmbient
  app的聲音可與其它app共存舞萄,但鎖屏和靜音情況會(huì)被停止眨补,除非當(dāng)前app是唯一播放的app

初始化錄音器

錄音需要調(diào)用AVAudioRecorder,下面代碼用于初始化錄音器:

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
playName = [NSString stringWithFormat:@"%@/play.aac",docDir];
//錄音設(shè)置
recorderSettingsDict =[[NSDictionary alloc] initWithObjectsAndKeys:
                                   [NSNumber                                        numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
                                   [NSNumber numberWithInt:8000],AVSampleRateKey,
                                   [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                                   AVAudioQualityHigh,AVEncoderAudioQualityKey,
                                   nil];

NSError *error = nil;
//必須真機(jī)上測(cè)試,模擬器上可能會(huì)崩潰
_recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:playName] settings:recorderSettingsDict error:&error];

先給大家看一下初始化字典里面的參數(shù):

AVFormatIDKey——音頻格式倒脓,主要有一下支持格式:

kAudioFormatLinearPCM
kAudioFormatMPEG4AAC
kAudioFormatAppleLossless
kAudioFormatAppleMA4
kAudioFormatiLBC
kAudioFormatULaw

選擇kAudioFormatLinearPCM會(huì)將未壓縮的音頻流寫入到文件中.這種格式保真度最高,不過相應(yīng)的文件也最大.選擇諸如kAudioFormatMPEG4AAC或者kAudioFormatAppleMA4的壓縮格式會(huì)顯著縮小文件,也能保證高質(zhì)量的音頻內(nèi)容撑螺。我這里選擇的是kAudioFormatMPEG4AAC,而且安卓和蘋果都支持播放。

AVSampleRateKey——采樣率崎弃,單位HZ甘晤,采樣率越小聲音質(zhì)量越低,通常有8000/44100/96000饲做,采樣率必須要設(shè)為11025才能使轉(zhuǎn)化成mp3格式后不會(huì)失真

AVNumberOfChannelsKey——聲道數(shù)线婚,1或2,除非使用外部硬件,否則通常應(yīng)當(dāng)創(chuàng)建單聲道錄音盆均。通常單聲道足以滿足我們錄音功能的需要塞弊。

AVEncoderAudioQualityKey——錄音音質(zhì),是一個(gè)枚舉值泪姨,這里我選AVAudioQualityHigh中等質(zhì)量游沿。

更多參考鏈接

開始錄制

_recorder.meteringEnabled = YES;//設(shè)置yes才能監(jiān)測(cè)輸入的音量大小,可以用作用戶界面反饋
[_recorder record];
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:volumeObserverMargin target:weakSelf selector:@selector(levelTimer:) userInfo:nil repeats:YES];//新建一個(gè)計(jì)時(shí)器用作測(cè)量音量大小

監(jiān)測(cè)音量

//輸入聲音的分貝大小計(jì)算
[_recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [_recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;

停止錄音

_recorder stop];
_recorder = nil;
//結(jié)束定時(shí)器
[volumeTimer invalidate];
volumeTimer = nil;

播放本地錄音

這里分兩步操作肮砾,一是播放本地音頻诀黍,二是進(jìn)行進(jìn)度監(jiān)聽

播放本地音頻

[playerLocal play];
progressTimer = [NSTimer scheduledTimerWithTimeInterval:playerTimeObserverMargin target:self selector:@selector(recorderTimeViewer) userInfo:nil repeats:YES];//新建計(jì)時(shí)器監(jiān)聽播放進(jìn)度

播放進(jìn)度監(jiān)聽

NSLog(@"總時(shí)長(zhǎng):%f--當(dāng)前時(shí)間點(diǎn):%f",_playerLocal.duration,_playerLocal.currentTime);

播放網(wǎng)絡(luò)音頻

_songItem = [[AVPlayerItem alloc]initWithURL:url];
_playerNetwork = [[AVPlayer alloc]initWithPlayerItem:_songItem];
[_playerNetwork play];

獲取網(wǎng)絡(luò)資源總時(shí)長(zhǎng)的方法:

netAudioTime = CMTimeGetSeconds(_songItem.asset.duration);

Tips

1..plist文件中加入麥克風(fēng)請(qǐng)求權(quán)限
2.如果需要播放網(wǎng)絡(luò)音頻,添加App Transport Security Settings下的Allow Arbitrary Loads并設(shè)置為YES
3.如果需要app支持后臺(tái)播放音頻仗处,需要打開Capabilities下面Background Modes下面的Audio,AirPlay,and Picture in Picture選項(xiàng)眯勾,但是審核的時(shí)候蘋果如果認(rèn)為你沒有必要打開這個(gè)功能,會(huì)被拒哦婆誓!
4.不用外接設(shè)備錄音和播放會(huì)聲音小咒精,解決辦法是播放前加入下面代碼:

NSError *audioError = nil;
BOOL success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&audioError];
if(!success)
{
NSLog(@"error doing outputaudioportoverride - %@", [audioError localizedDescription]);
}

Tips one more

完整功能的demo已經(jīng)更新,分別實(shí)現(xiàn)了錄音旷档、播放本地錄音和播放網(wǎng)絡(luò)音頻的播放暫停歇拆、繼續(xù)鞋屈、停止范咨。使用可以參照demo。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厂庇,一起剝皮案震驚了整個(gè)濱河市渠啊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌权旷,老刑警劉巖替蛉,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拄氯,居然都是意外死亡躲查,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門译柏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镣煮,“玉大人,你說我怎么就攤上這事鄙麦〉浯剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵胯府,是天一觀的道長(zhǎng)介衔。 經(jīng)常有香客問我,道長(zhǎng)骂因,這世上最難降的妖魔是什么炎咖? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮侣签,結(jié)果婚禮上塘装,老公的妹妹穿的比我還像新娘。我一直安慰自己影所,他們只是感情好蹦肴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猴娩,像睡著了一般阴幌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卷中,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天矛双,我揣著相機(jī)與錄音,去河邊找鬼蟆豫。 笑死议忽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的十减。 我是一名探鬼主播栈幸,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愤估,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了速址?” 一聲冷哼從身側(cè)響起玩焰,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芍锚,沒想到半個(gè)月后昔园,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡并炮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年默刚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣触。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羡棵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗅钻,到底是詐尸還是另有隱情皂冰,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布养篓,位于F島的核電站秃流,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柳弄。R本人自食惡果不足惜舶胀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧注。 院中可真熱鬧嚣伐,春花似錦、人聲如沸萍丐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逝变。三九已至基茵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳影,已是汗流浹背拱层。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宴咧,地道東北人根灯。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箱吕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芥驳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容