1、短音播放:
短音是指播放時長小於30秒的聲音,而且使用短音播放不能同時播放多個,調用播放方法立即播放,幾乎沒有可調控的屬性,除了播放完會有一個回調。在app的提示音、動作音可以使用這個方法,簡單方便。
首先,使用短音的文件路徑構建一個SystemSoundID對象:
SystemSoundID _soundID;
NSString * soundPath = [[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"sound"]stringByAppendingPathComponent:soundFileName]; //獲取音頻文件路徑
NSURL * soundURL = [[NSURL alloc]initFileURLWithPath:soundPath];//使用路徑構建NSURL對象
OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &_soundID); //加載音頻;
if (error) {
NSLog(@"error : %d",(int)error);
return;
}
然後使用這個與音頻文件關聯起來的SystemSoundID來播放聲音:AudioServicesPlaySystemSound(_soundID);
一句話就好了。播放還有一個函數:AudioServicesPlayAlertSound,這個會根據設備提供一些警告音效果,例如震動
還可以添加播放結束後的回調:
AudioServicesAddSystemSoundCompletion(_soundID, NULL, NULL, SoundFinished, NULL);
第一個參數是播放音頻的SystemSoundID,第四個是回調的函數,第二個和第三個參數是指定回調函數調用的runloop和相應的runloop模式,最後一個是自定義的傳入參數,貌似C類型的回調函數都會有一個自定義的參數,用於提供給回調函數,便於做自定義的操作。
回調函數是AudioServicesSystemSoundCompletionProc類型,定義爲:
typedef void (*AudioServicesSystemSoundCompletionProc) (
SystemSoundID ssID,
void *clientData
);
也就是函數有兩個參數,一個是註冊回調函數時的SystemSoundID變量,還一個就是上面的自定義參數。
2、一般音頻播放:AVAudioPlayer
AVAudioPlayer也是通過資源文件的地址構建,然後調用播放方法,系統自動播放。沒有對於聲音屬性的,例如音軌、頻率之類的調控,但可以控制播放的過程,也可以獲取音頻的信息,適合對聲音沒有很細緻要求的播放,而且簡單易用。
首先,使用音頻文件地址構建:
NSURL * musicURL = [[NSURL alloc]initFileURLWithPath:musicPath];
_audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:musicURL error:&error];
if (error) {
NSLog(@"error : %@",error);
return;
}
然後播放和控制都基於這個_audioPlayer對象。
播放操作:
[_audioPlayer prepareToPlay];//準備播放
[_audioPlayer play];//播放
[_audioPlayer pause];//暫停
[_audioPlayer stop]; //停止
對於prepareToPlay,文檔的說明是:“Calling this method preloads buffers and acquires the audio hardware needed
for playback, which minimizes the lag between calling the play
method and the start of sound
output.”。也就是說調用這個方法可以讓硬件等提前準備好,能夠縮短調用play方法播放到實際聲音出來之間的時間。
如果想要跳轉到某個時刻播放,可以使用currentTime屬性:
[_audioPlayer setCurrentTime:current];
但是currentTime是NSTimeInterval類型,如果你想我想播放中間或說3/4位置,怎麼辦?
還有一個屬性duration,是整個音頻播放的總時長,如果想播放某個比例位置,就用這個比例乘以duration得到時長,然後用這個時長設置currentTime就可一條跳轉過去了。
還有一些屬性:
playing 是否正在播放
volume 音量,可用值區間爲[0,1]
pan 調節左右聲道相對大小。區間爲[-1,1],越小左聲道聲音越大,右聲道越小;越大則相反。
rate 播放速度,假設正常速度爲rate,可調節區間爲:[rate/2,2*rate];不過調節之前要先把enableRate設爲YES;
然後是委託delegate和一些關於音頻信息的屬性。
AVAudioPlay可以說就是iOS本身封裝好的一個音頻播放器,我們需要做簡單播放的時候,就丟給它一個音頻文件給它播放就可以了。都是封裝越高級,操作越簡單,同時也越沒有什麼能夠插手的。
demo的github地址:AudioExample