iOS開發(fā)-音頻播放

iOS--音頻的簡單使用

  • 音效播放(短時間的音頻文件)

    1:AudioServicesCreateSystemSoundID

    2:AudioServicesPlaySystemSound

  • 音樂播放(長時間的音頻文件)

    1:AVAudioPlayer(只能播放本地的音頻文件)MPMusicPlayerController

    2:AVPlayer
    能播放本地椎木、遠程的音頻、視頻文件
    基于Layer顯示炊昆,得自己去編寫控制面板

    3:MPMoviePlayerController
    能播放本地挠锥、遠程的音頻瞄摊、視頻文件
    自帶播放控制面板(暫停、播放、播放進度档悠、是否要全屏)

    4:MPMoviePlayerViewController
    能播放本地思喊、遠程的音頻壁酬、視頻文件
    內(nèi)部是封裝了MPMoviePlayerController
    播放界面默認就是全屏的
    如果播放功能比較簡單,僅僅是簡單地播放遠程恨课、本地的視頻文件舆乔,建議用這個

    5: DOUAudioStreamer
    能播放遠程、本地的音頻文件
    監(jiān)聽緩沖進度剂公、下載速度希俩、下載進度

1:AVAudioRecorder的簡單使用

  • 只能播放本地音樂

錄音

  • 初始化時setting的參數(shù)設置:
    設置錄制音頻的質(zhì)量

// 創(chuàng)建錄音配置信息的字典
NSMutableDictionary *setting = [NSMutableDictionary dictionary];

// 音頻格式
setting[AVFormatIDKey] = @(kAudioFormatAppleIMA4);

// 錄音采樣率(Hz) 如:AVSampleRateKey==8000/44100/96000(影響音頻的質(zhì)量)
setting[AVSampleRateKey] = @(8000.0);

// 音頻通道數(shù) 1 或 2
setting[AVNumberOfChannelsKey] = @(1);

// 線性音頻的位深度 8、16纲辽、24颜武、32
setting[AVLinearPCMBitDepthKey] = @(8);

//錄音的質(zhì)量
setting[AVEncoderAudioQualityKey] = [NSNumber numberWithInt:AVAudioQualityHigh];

 // 1.創(chuàng)建存放錄音文件的地址
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filePath = [path stringByAppendingPathComponent:@"321.caf"];
        NSURL *url = [NSURL URLWithString:filePath];
        
        // 2.創(chuàng)建錄音對象
        self.recoder = [[AVAudioRecorder alloc] initWithURL:url settings:nil error:nil];
        
        // 3.準備錄音
        [self.recoder prepareToRecord];    
         
// 開始錄音
    [self.recoder record];
// 暫停錄音
    [self.recoder stop];
    

播放音效

    // 1.創(chuàng)建SystemSoundID,根據(jù)音效文件來生成
    SystemSoundID soundID = 0;
    
    // 2.根據(jù)音效文件,來生成SystemSoundID
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"win.aac" withExtension:nil];
    CFURLRef urlRef = (__bridge CFURLRef)(url);
    AudioServicesCreateSystemSoundID(urlRef, &soundID);
    
    // 播放音效
    // AudioServicesPlaySystemSound(soundID); 
    
    //有震動效果
     AudioServicesPlayAlertSound(self.soundID);  

優(yōu)化

    // 1.定義SystemSoundID
    SystemSoundID soundID = 0;
    
    // 2.從字典中取出對應soundID,如果取出是nil,表示之前沒有存放在字典
    soundID = [self.soundIDs[soundName] unsignedIntValue];
    if (soundID == 0) {
        CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
        AudioServicesCreateSystemSoundID(url, &soundID);
        
        // 將soundID存入字典
        [self.soundIDs setObject:@(soundID) forKey:soundName];
    }
    
    // 3.播放音效
    AudioServicesPlaySystemSound(soundID);

播放音樂

    // 取出資源的URL
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"1201111234.mp3" withExtension:nil];
    
    // 創(chuàng)建播放器
    NSError *error = nil;
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    
    // 準備播放
    [player prepareToPlay];
     
    // 播放歌曲
    // [self.player play];
    
     //注意:停止播放效果和暫停播放一樣,并不會重新開始播放
     //暫停播放
     [player pause];

     //停止播放
     [player stop];
        
注意:一個play對象對應一個url拖吼。因此切換歌曲的時候不能用kvc去修改url的值
優(yōu)化:

+ (void)playMusicWithMusicName:(NSString *)musicName
{
    //判斷是否為空鳞上,為空程序直接崩潰
    assert(musicName);
    
    // 1.定義播放器
    AVAudioPlayer *player = nil;
    
    // 2.從字典中取player,如果取出出來是空,則對應創(chuàng)建對應的播放器
    player = _players[musicName];
    if (player == nil) {
        // 2.1.獲取對應音樂資源
        NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil];
        
        if (fileUrl == nil) return;
        
        // 2.2.創(chuàng)建對應的播放器
        player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:nil];
        
        // 2.3.將player存入字典中
        [_players setObject:player forKey:musicName];
        
        // 2.4.準備播放
        [player prepareToPlay];
    }
    
    // 3.播放音樂
    [player play];
}

//暫停音樂
+ (void)pauseMusicWithMusicName:(NSString *)musicName
{
    assert(musicName);
    
    // 1.取出對應的播放
    AVAudioPlayer *player = _players[musicName];
    
    // 2.判斷player是否nil
    if (player) {
        [player pause];
    }
}

//停止音樂
+ (void)stopMusicWithMusicName:(NSString *)musicName
{
    assert(musicName);
    
    // 1.取出對應的播放
    AVAudioPlayer *player = _players[musicName];
    
    // 2.判斷player是否nil
    if (player) {
        [player stop];
        [_players removeObjectForKey:musicName];
        player = nil;
    }
}


2:AVPlayer的簡單使用

  • 與AVAudioRecorder的不同之處:
    1:可以播放遠程音樂。
    2:可以通過替換item來替換播放文件(而不用通過創(chuàng)建新的player)

 //延時加載
 - (AVPlayer *)player
{
    if (_player == nil) {
        // 1.獲取URL(遠程/本地)
        // NSURL *url = [[NSBundle mainBundle] URLForResource:@"01-知識回顧.mp4" withExtension:nil];
        NSURL *url = [NSURL URLWithString:@"http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4"];
        
        // 2.創(chuàng)建AVPlayerItem
        AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
        
        // 3.創(chuàng)建AVPlayer
        _player = [AVPlayer playerWithPlayerItem:item];
        
        // 4.添加AVPlayerLayer
        AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        layer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width * 9 / 16);
        [self.view.layer addSublayer:layer];
    }
    return _player;
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吊档,一起剝皮案震驚了整個濱河市篙议,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怠硼,老刑警劉巖涡上,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拒名,居然都是意外死亡吩愧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門增显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雁佳,“玉大人脐帝,你說我怎么就攤上這事√侨ǎ” “怎么了堵腹?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長星澳。 經(jīng)常有香客問我疚顷,道長,這世上最難降的妖魔是什么禁偎? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任腿堤,我火速辦了婚禮,結(jié)果婚禮上如暖,老公的妹妹穿的比我還像新娘笆檀。我一直安慰自己,他們只是感情好盒至,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布酗洒。 她就那樣靜靜地躺著,像睡著了一般枷遂。 火紅的嫁衣襯著肌膚如雪樱衷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天酒唉,我揣著相機與錄音箫老,去河邊找鬼。 笑死黔州,一個胖子當著我的面吹牛耍鬓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播流妻,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼牲蜀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绅这?” 一聲冷哼從身側(cè)響起涣达,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎证薇,沒想到半個月后度苔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浑度,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年寇窑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箩张。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡甩骏,死狀恐怖窗市,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饮笛,我是刑警寧澤咨察,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站福青,受9級特大地震影響摄狱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜无午,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一媒役、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧指厌,春花似錦刊愚、人聲如沸踊跟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽商玫。三九已至箕憾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拳昌,已是汗流浹背袭异。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炬藤,地道東北人御铃。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像沈矿,于是被迫代替她去往敵國和親上真。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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