天天看點

iOS音頻播放程式設計簡介

音效  

使用架構AudioToolbox.framework(基于C語言)

本質是将短音頻注冊到系統服務上(System Sound Service)

系統服務限制

1.音頻播放時間不能超過30秒

2.音頻資料格式是PCM或IMA4(必須)

3.音頻檔案類型是caf、air、wav類型

使用系統聲音服務步驟

1.添加架構AudioToolbox.framework,引入頭檔案 #import <AudioToolbox/AudioToolbox.h>

2.首先擷取檔案路徑

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

    NSURL *fileUrl=[NSURL fileURLWithPath:audioFile];

3.建立聲音服務

    SystemSoundID soundID=0;

    AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);

4.添加聲音服務到系統 (如果需要在播放完之後執行某些操作,可以調用如下方法注冊一個播放完成回調函數)

AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);

5播放聲音服務    

AudioServicesPlaySystemSound(soundID);//播放音效

  AudioServicesPlayAlertSound(soundID);//播放音效并震動

6. 播放完成回調函數

void soundCompleteCallback(SystemSoundID soundID,void * clientData){

    NSLog(@“做自己需要的操作…”);

}

音樂

使用架構AVFoundation.framework中的AVAudioPlayer來實作音樂播放

它可以實作多種音頻的播放,還能進行音量、進度、播放速度的控制

使用步驟

1.添加架構AVFoundation.framework,引入頭檔案<AVFoundation/AVFoundation.h>

2.擷取檔案路徑

NSString *urlStr=[[NSBundle mainBundle]pathForResource:@"陳奕迅 - 浮誇.mp3" ofType:nil];

        NSURL *url=[NSURL fileURLWithPath:urlStr];

3.初始化AVAudioPlayer 對象,指定檔案路徑

AVAudioPlayer* myAudioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

4.設定播放器屬性:音量大小、循環次數等

  myAudioPlayer.volume=1.0;//音量大小

myAudioPlayer.numberOfLoops=10;//設定為0表示不循環,隻播放一遍

        myAudioPlayer.delegate=self;//設定代理

5.加載音頻檔案到緩存,準備播放

[myAudioPlayer prepareToPlay];

6.播放音樂

[myAudioPlayer play];//開始播放

[myAudioPlayer playAtTime:(NSTimeInterval)time];//在指定時間播放

7.播放完畢回調函數

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{

    NSLog(@"音樂播放完成...");

   }

以上是使用AVAudioPlayer的簡單實作方法,具體屬性以及方法見下面

AVAudioPlayer屬性 說明

@property(readonly, getter=isPlaying) BOOL playing 是否正在播放,隻讀

@property(readonly) NSUInteger numberOfChannels 音頻聲道數,隻讀

@property(readonly) NSTimeInterval duration 音頻時長

@property(readonly) NSURL *url 音頻檔案路徑,隻讀

@property(readonly) NSData *data 音頻資料,隻讀

@property float pan 立體聲平衡,如果為-1.0則完全左聲道,如果0.0則左右聲道平衡,如果為1.0則完全為右聲道

@property float volume 音量大小,範圍0-1.0

@property BOOL enableRate 是否允許改變播放速率

@property float rate 播放速率,範圍0.5-2.0,如果為1.0則正常播放,如果要修改播放速率則必須設定enableRate為YES

@property NSTimeInterval currentTime 目前播放時長

@property(readonly) NSTimeInterval deviceCurrentTime 輸出裝置播放音頻的時間,注意如果播放中被暫停此時間也會繼續累加

@property NSInteger numberOfLoops 循環播放次數,如果為0則不循環,如果小于0則無限循環,大于0則表示循環次數

@property(readonly) NSDictionary *settings 音頻播放設定資訊,隻讀

@property(getter=isMeteringEnabled) BOOL meteringEnabled 是否啟用音頻測量,預設為NO,一旦啟用音頻測量可以通過updateMeters方法更新測量值

對象方法 說明

- (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError 使用檔案URL初始化播放器,注意這個URL不能是HTTP URL,AVAudioPlayer不支援加載 網絡媒體流,隻能播放本地檔案

- (instancetype)initWithData:(NSData *)data error:(NSError **)outError 使用NSData初始化播放器,注意使用此方法時必須檔案格式和檔案字尾一緻,否則出錯,是以相比 此方法更推薦使用上述方法或- (instancetype)initWithData:(NSData *)data fileTypeHint:(NSString *)utiString error:(NSError **)outError 方法進行初始化

- (BOOL)prepareToPlay; 加載音頻檔案到緩沖區,注意即使在播放之前音頻檔案沒有加載到緩沖區程式也會隐式調用此方法。

- (BOOL)play; 播放音頻檔案

- (BOOL)playAtTime:(NSTimeInterval)time 在指定的時間開始播放音頻

- (void)pause; 暫停播放

- (void)stop; 停止播放

- (void)updateMeters 更新音頻測量值,注意如果要更新音頻測量值必須設定meteringEnabled為YES,通過音頻測量值可以即時獲得音頻分貝等資訊

- (float)peakPowerForChannel:(NSUInteger)channelNumber; 獲得指定聲道的分貝峰值,注意如果要獲得分貝峰值必須在此之前調用updateMeters方法

- (float)averagePowerForChannel:(NSUInteger)channelNumber 獲得指定聲道的分貝平均值,注意如果要獲得分貝平均值必須在此之前調用updateMeters方法

@property(nonatomic, copy) NSArray *channelAssignments 獲得或設定播放聲道

代理方法 說明

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 音頻播放完成

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 音頻解碼發生錯誤

使用MediaPlayer.framework架構中的MPMusicPlayerController來實作音樂庫中音樂的播放

MPMusicPlayerController中提供了兩種播放器 ,如下:

+ (MPMusicPlayerController *)applicationMusicPlayer; 應用退出後音樂播放會自動停止

+ (MPMusicPlayerController *)systemMusicPlayer;應用停止後不會退出播放狀态

MPMusicPlayerController的加載需要通過一個播放隊列或者是播放集,支援上一曲、下一曲。方法如下:

- (void)setQueueWithQuery:(MPMediaQuery *)query

- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection

使用步驟如下:

1.添加架構MediaPlayer.framework,引入頭檔案#import <MediaPlayer/MediaPlayer.h>

2.擷取媒體源,得到MPMediaQueue或者MPMediaItemCollection,以下是MPMediaQueue提供的方法,按需要選擇。

+ (MPMediaQuery *)albumsQuery; 專輯

+ (MPMediaQuery *)artistsQuery; 藝術家

+ (MPMediaQuery *)songsQuery; 歌集

+ (MPMediaQuery *)playlistsQuery; 演出劇目表

+ (MPMediaQuery *)podcastsQuery; 播客

+ (MPMediaQuery *)audiobooksQuery; 有聲讀物

+ (MPMediaQuery *)compilationsQuery; 編輯

+ (MPMediaQuery *)composersQuery; 作曲家

+ (MPMediaQuery *)genresQuery; 流派

MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];擷取播放隊列(所有歌曲)

NSMutableArray *array=[NSMutableArray array];

    for (MPMediaItem *item in mediaQueue.items) {

        [array addObject:item];

    }

    MPMediaItemCollection *mediaItemCollection=[[MPMediaItemCollection alloc]initWithItems:[array copy]];//用播放隊列變為播放集

也可以使用者自己選擇媒體源,這裡需要用到MPMediaPickerController

mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeAny];

        mediaPicker.allowsPickingMultipleItems=YES;//允許多選

        [email protected]"請選擇要播放的音樂";

      mediaPicker.delegate=self;//設定選擇器代理

//選擇完成回調

-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection{

給musicPlayer設定媒體源    

}

//取消選擇回調

-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{

}

對于用于顯示的歌曲的各種資訊都存放在 MPMediaItem中

MPMediaItem *mediaItem=[mediaItemCollection.items firstObject];//第一個播放音樂

3.初始化MPMusicPlayerController

MPMusicPlayerController*musicPlayer=[MPMusicPlayerController systemMusicPlayer];

        [musicPlayer beginGeneratingPlaybackNotifications];//開啟通知,否則監控不到MPMusicPlayerController的通知

[musicPlayer setQueueWithItemQuery:mediaQueue];//用播放隊列設定媒體源

[musicPlayer setQueueWithItemCollection:mediaItemCollection];//用播放集設定媒體源

NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];//添加觀察者,監聽musicPlayer播放狀态的變化

    [notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:musicPlayer];

4.對于musicPlayer的一些基本操作

[musicPlayer play]; 播放

[musicPlayer pause]; 暫停

[musicPlayer stop]; 停止

[musicPlayer skipToNextItem]; 下一曲

[musicPlayer skipToPreviousItem]; 上一曲

[musicPlayer skipToBeginning]; 從起始位置播放

以下是對MPMusicPlayerController對象屬性、方法的詳細介紹

@property (nonatomic, readonly) MPMusicPlaybackState playbackState 播放器狀态,枚舉類型:

MPMusicPlaybackStateStopped:停止播放 MPMusicPlaybackStatePlaying:正在播放

MPMusicPlaybackStatePaused:暫停播放

MPMusicPlaybackStateInterrupted:播放中斷

MPMusicPlaybackStateSeekingForward:向前查找

MPMusicPlaybackStateSeekingBackward:向後查找

@property (nonatomic) MPMusicRepeatMode repeatMode 重複模式,枚舉類型:

MPMusicRepeatModeDefault:預設模式,使用使用者的首選項(系統音樂程式設定)

MPMusicRepeatModeNone:不重複

MPMusicRepeatModeOne:單曲循環

MPMusicRepeatModeAll:在目前清單内循環

@property (nonatomic) MPMusicShuffleMode shuffleMode 随機播放模式,枚舉類型:

MPMusicShuffleModeDefault:預設模式,使用使用者首選項(系統音樂程式設定)

MPMusicShuffleModeOff:不随機播放

MPMusicShuffleModeSongs:按歌曲随機播放

MPMusicShuffleModeAlbums:按專輯随機播放

@property (nonatomic, copy) MPMediaItem *nowPlayingItem 正在播放的音樂項

@property (nonatomic, readonly) NSUInteger indexOfNowPlayingItem 目前正在播放的音樂在播放隊列中的索引

@property(nonatomic, readonly) BOOL isPreparedToPlay 是否準好播放準備

@property(nonatomic) NSTimeInterval currentPlaybackTime 目前已播放時間,機關:秒

@property(nonatomic) float currentPlaybackRate 目前播放速度,是一個播放速度倍率,0表示暫停播放,1代表正常速度

類方法 說明

+ (MPMusicPlayerController *)applicationMusicPlayer; 擷取應用播放器,注意此類播放器無法在背景播放

+ (MPMusicPlayerController *)systemMusicPlayer 擷取系統播放器,支援背景播放

對象方法 說明

- (void)setQueueWithQuery:(MPMediaQuery *)query 使用媒體隊列設定播放源媒體隊列

- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection 使用媒體項集合設定播放源媒體隊列

- (void)skipToNextItem 下一曲

- (void)skipToBeginning 從起始位置播放

- (void)skipToPreviousItem 上一曲

- (void)beginGeneratingPlaybackNotifications 開啟播放通知,注意不同于其他播放器,MPMusicPlayerController要想獲得通知必須首先開啟,預設情況無法獲得 通知

- (void)endGeneratingPlaybackNotifications 關閉播放通知

- (void)prepareToPlay 做好播放準備(加載音頻到緩沖區),在使用play方法播放時如果沒有做好準備回自動調用該方法

- (void)play 開始播放

- (void)pause 暫停播放

- (void)stop 停止播放

- (void)beginSeekingForward 開始向前查找(快進)

- (void)beginSeekingBackward 開始向後查找(快退)

- (void)endSeeking 結束查找

通知 說明(注意:要想獲得MPMusicPlayerController通知必須首先調用beginGeneratingPlaybackNotifications開啟通知)

MPMusicPlayerControllerPlaybackStateDidChangeNotification 播放狀态改變

MPMusicPlayerControllerNowPlayingItemDidChangeNotification 目前播放音頻改變

MPMusicPlayerControllerVolumeDidChangeNotification 聲音大小改變

MPMediaPlaybackIsPreparedToPlayDidChangeNotification 準備好播放