iOS 簡單實現音頻的播放

     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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章