iOS之AVAudioPlayer

蘋果系統(tǒng)帶有一個(gè)音頻播放器,這就是AVAudioPlayer级野,要使用這個(gè)播放器進(jìn)行播放音頻棒厘,首先需要?jiǎng)?chuàng)建這個(gè)播放器對(duì)象,而這個(gè)播放器的創(chuàng)建所需的頭文件并不是在foundation的頭文件下而是在播放器自己專屬的頭文件下如迟,如下:

#import <AVFoundation/AVFoundation.h>

而AV開頭的文件里包含了許多的和音視頻相關(guān)的頭文件收毫。

一、創(chuàng)建播放器對(duì)象

我們先聲明一個(gè)播放器的全局變量殷勘,而且只能聲明稱全局變量此再。

AVAudioPlayer *_audioPlayer;

此時(shí)我們創(chuàng)建播放器對(duì)象:

_audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

這里有兩個(gè)參數(shù):
參數(shù)1:需要播放的音頻的地址,這里可以是本地或者是網(wǎng)頁的文件
參數(shù)2:錯(cuò)誤信息
這里就暫且使用本地資源玲销,需要?jiǎng)?chuàng)建本地資源的路徑输拇,然后轉(zhuǎn)為url路徑

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];

這里有兩個(gè)參數(shù):
參數(shù)1:文件的名字
參數(shù)2:文件的類型
注意的是:在參數(shù)1中如果包含了名字和類型,在參數(shù)2中可以不用謝類型贤斜,直接寫nil就可以了策吠。

然后將string類型的路徑用url來接收

NSURL *url = [NSURL fileURLWithPath:path];

這里的參數(shù)就是之前創(chuàng)建的NSString類型的路徑。
完整的代碼如下:

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
NSURL *url = [NSURL fileURLWithPath:path];
_audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

二瘩绒、播放

音頻播放之前需要準(zhǔn)備播放猴抹,這里需要調(diào)用一個(gè)方法;

[_audioPlayer prepareToPlay];

就緒后直接播放

[_audioPlayer play];

以上就是和音頻最主要的功能的介紹锁荔。

三蟀给、音頻播放器的相關(guān)功能

下面是對(duì)音頻播放器的擴(kuò)展,音頻播放器一般會(huì)有的功能如:開始播放阳堕、暫停播放坤溃、調(diào)整音頻的音量的大小、調(diào)整音頻的進(jìn)度嘱丢、顯示音頻文件的內(nèi)部附有的圖片信息及協(xié)議代理等薪介。

1.開始和暫停播放音頻

首先,為了方便越驻,我們?cè)趕toryBoard去拖一個(gè)按鈕控件汁政,主要功能是讓音頻暫停和播放道偷。
這里我們可以用到自動(dòng)布局的相關(guān)知識(shí),在storyBoard里運(yùn)用約束條件记劈,使得可以進(jìn)行適配手機(jī)勺鸦。這里對(duì)按鈕的左右下和高度進(jìn)行約束。
讓按鈕的初始文字顯示為播放目木,點(diǎn)擊播放后,顯示為STOP,暫停后顯示為play换途;隨便設(shè)個(gè)背景顏色用于區(qū)分
然后直接在storyBoard里面拖個(gè)方法到ViewController.m文件的@implementation里,然后就在這里這個(gè)按鈕的點(diǎn)擊事件里執(zhí)行音頻的播放和暫停
代碼如下:

#pragma mark - 開始暫停按鈕
- (IBAction)button:(UIButton *)sender {
    // 用一個(gè)靜態(tài)變量對(duì)按鈕的狀態(tài)進(jìn)行控制
    static int i = 0;
    if (i == 0) {
        // 開始播放
        [_audioPlayer play];
        // 開始后按鈕文字變?yōu)閟top刽射,按鈕的狀態(tài)為正常
        [sender setTitle:@"stop" forState:UIControlStateNormal];
        i = 1;
    }
    else {
        // 4.暫停播放
        [_audioPlayer pause];
        //[_audioPlayer stop];
        [sender setTitle:@"play" forState:UIControlStateNormal];
        i = 0;
    }
}

2.調(diào)整音量大小

我們還是可以在storyBoard中拖一個(gè)控件出來军拟,這里需要一個(gè)步進(jìn)器,然后把相關(guān)的方法拖到文件中去實(shí)現(xiàn)誓禁。

#pragma mark - 改變音量
- (IBAction)volumeChange:(UIStepper *)sender {
    // 設(shè)置音量(0 ~ 1);我們?cè)O(shè)置的步進(jìn)的音量值為0.1
    _audioPlayer.volume = sender.value;
}

3.調(diào)整音頻播放進(jìn)度

3.1更新進(jìn)度

調(diào)整進(jìn)度就需要用到滑塊控件懈息,然后向之前的在storyBoard里去拖個(gè)滑塊的控件,還有相關(guān)的屬性和方法摹恰。
這里我們可能會(huì)運(yùn)用到定時(shí)器辫继,所以我們需要?jiǎng)?chuàng)建定時(shí)器,而這個(gè)定時(shí)器的創(chuàng)建應(yīng)該放到準(zhǔn)備播放音頻的時(shí)候就創(chuàng)建出來俗慈。

// 添加定時(shí)器
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];

這里的參數(shù)為:
參數(shù)1:定時(shí)器的監(jiān)測(cè)時(shí)間姑宽,單位是S
參數(shù)2:執(zhí)行的對(duì)象
參數(shù)3:選擇器(需要執(zhí)行的方法)
參數(shù)4:用戶的信息,一般為nil
參數(shù)5:是否需要重復(fù)執(zhí)行闺阱,這里是需要的低千,為YES
實(shí)現(xiàn)選擇器中的方法;

#pragma mark - 更新進(jìn)度updateProgress
- (void)updateProgress {
    // 當(dāng)前時(shí)間
    double currentTime = _audioPlayer.currentTime;
    // 總時(shí)間
    double totalTime = _audioPlayer.duration;
    // 計(jì)算進(jìn)度
    float progress = currentTime / totalTime;
    // 展示到進(jìn)度條上
    self.sliderProgress.value = progress;
}
3.2更改滑塊的進(jìn)度

這里就需要實(shí)現(xiàn)滑塊拖出來的方法了

#pragma mark - 改變進(jìn)度條
- (IBAction)sliderProgress:(UISlider *)sender {
    // 當(dāng)前時(shí)間 = 總時(shí)間 * 爆發(fā)進(jìn)度
    double currentTime = _audioPlayer.duration * _sliderProgress.value;
    // 是否讓進(jìn)度條實(shí)時(shí)更新馏颂。
    _sliderProgress.continuous = YES;
    // 重新設(shè)置播放器的當(dāng)前時(shí)間
    _audioPlayer.currentTime = currentTime;
}

4.獲取專輯的圖片

同樣的需要在storyBoard上拖一個(gè)imageView的控件示血,展示出其屬性。

#pragma mark - 獲取專輯圖片
- (void)showPlayerImage {
    AVURLAsset *asset = [[AVURLAsset alloc]initWithURL:_audioPlayer.url options:nil];
    NSString *format = [asset availableMetadataFormats].firstObject;
    NSArray *array = [asset metadataForFormat:format];
    for (AVMutableMetadataItem *item in array) {
        // 這里的artwork是需要在音頻文件里去得到的救拉∧焉螅可以吧array打印出來,得到里面的值
        if ([item.commonKey isEqualToString:@"artwork"]) {
            NSData *data = (NSData *)item.value;
            UIImage *image = [UIImage imageWithData:data];
            _imageView.image = image;
        }
    }
}

5.協(xié)議代理

5.1當(dāng)前音頻播放器播放的音頻結(jié)束后會(huì)自動(dòng)調(diào)用這個(gè)方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    NSLog(@"播放結(jié)束");
    // 切換下一首
    [self preparePlayerWithName:@"春天里.mp3"];
    [_audioPlayer play];
}
5.2音頻播放被中斷的時(shí)候會(huì)調(diào)用這個(gè)方法

一般有電話的接入和有短信接收的時(shí)候亿絮,一般會(huì)有中斷告喊,這需要調(diào)用這個(gè)方法。我們一般執(zhí)行的都是暫停音頻的播放派昧。

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player {
    NSLog(@"一般這個(gè)方法中會(huì)暫停音頻");
    [player stop];
}
5.3中斷結(jié)束后

一般就在來電結(jié)束后會(huì)調(diào)用這個(gè)方法黔姜。一般在這個(gè)方法中執(zhí)行的是會(huì)繼續(xù)音頻的播放。

// 中斷結(jié)束的時(shí)候會(huì)調(diào)用這個(gè)方法
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags {
    // 一般在這個(gè)方法中繼續(xù)播放音頻
    [player play];
    NSLog(@"繼續(xù)播放");
}
5.4解碼出錯(cuò)
// 解碼錯(cuò)誤的時(shí)候會(huì)調(diào)用這個(gè)方法
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
    NSLog(@"文件出錯(cuò)");
}

總結(jié):

1.這里需要導(dǎo)入的頭文件一定是:AVFoundation/AVFoundation.h蒂萎;
2.音頻播放器AVAudioPlayer作為一個(gè)對(duì)象秆吵,要使用必須要先創(chuàng)建對(duì)象,創(chuàng)建對(duì)象前需要給一個(gè)音頻文件的路徑(一般都是url)五慈;
3.聲明對(duì)象一定是要全局變量纳寂,不然運(yùn)行可能失敗主穗,因?yàn)闀?huì)調(diào)用到偏硬件的;
4.就是在storyBoard里拖控件的時(shí)候需要注意自動(dòng)布局的約束條件毙芜,為的是適配忽媒;
5.在有代理的設(shè)置的時(shí)候,一定要遵循代理:AVAudioPlayerDelegate腋粥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晦雨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隘冲,更是在濱河造成了極大的恐慌闹瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对嚼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绳慎,警方通過查閱死者的電腦和手機(jī)纵竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杏愤,“玉大人靡砌,你說我怎么就攤上這事∩郝ィ” “怎么了通殃?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厕宗。 經(jīng)常有香客問我画舌,道長,這世上最難降的妖魔是什么已慢? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任曲聂,我火速辦了婚禮,結(jié)果婚禮上佑惠,老公的妹妹穿的比我還像新娘朋腋。我一直安慰自己,他們只是感情好膜楷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布旭咽。 她就那樣靜靜地躺著,像睡著了一般赌厅。 火紅的嫁衣襯著肌膚如雪穷绵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天特愿,我揣著相機(jī)與錄音请垛,去河邊找鬼催训。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宗收,可吹牛的內(nèi)容都是我干的漫拭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼混稽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼采驻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匈勋,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤礼旅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洽洁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痘系,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年饿自,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汰翠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昭雌,死狀恐怖复唤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烛卧,我是刑警寧澤佛纫,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站总放,受9級(jí)特大地震影響呈宇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜局雄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一攒盈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哎榴,春花似錦型豁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至飘言,卻和暖如春衣形,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工谆吴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倒源,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓句狼,卻偏偏與公主長得像笋熬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腻菇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫胳螟、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,121評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評(píng)論 25 707
  • 文|嬰幼兒百科 入夏之后,媽媽圈里突然被手足口病刷屏了—— “某幼兒園因疑似出現(xiàn)手足口患兒休園2周”丘薛、“孩子在小區(qū)...
    尹Xiao妹兒閱讀 368評(píng)論 0 0
  • 吃完火鍋我們一起去看電影嘉竟,雖然我看過《大魚海棠》了,但再看一遍還是很有感觸洋侨,喜歡這部電影舍扰,處處是哲理,講的愛情那么...
    小魚兒666閱讀 185評(píng)論 0 1
  • 緣來客棧的老板陳姐是一個(gè)典型的四川女人凰兑,皮膚潤白妥粟,長發(fā)及腰审丘,豐韻多姿吏够,喜著各色鮮艷的長裙,飄飄然從每一桌客人身旁刮...
    見手青閱讀 560評(píng)論 3 0