新增按鈕聲音 播放聲音
AudioToolbox framework
使用AudioToolbox framework。這個框架可以將比較短的聲音註冊到 system sound服務上。被註冊到system sound服務上的聲音稱之為 system sounds。它必須滿足下面幾個條件。
1、 播放的時間不能超過30秒
2、資料必須是 PCM或者IMA4流格式, mp3也可以
3、必須被打包成下面三個格式之一:Core Audio Format (.caf), Waveform audio (.wav), 或者 Audio Interchange File (.aiff),mp3格式也可以
聲音檔案必須放到裝置的本地資料夾下面。通過AudioServicesCreateSystemSoundID方法註冊這個聲音檔案,AudioServicesCreateSystemSoundID需要聲音檔案的url的CFURLRef物件。看下面註冊程式碼:
- (void)playSoundWithName:(NSString *)name type:(NSString *)type
{
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:type];
if([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSURL *url = [NSURL fileURLWithPath:path];
SystemSoundID sound;
AudioServicesCreateSystemSoundID((
AudioServicesPlaySystemSound(sound);
}
else {
NSLog(@"**** Sound Error: file not found: %@", path);
}
}
AVFoundation framework
對於壓縮過Audio檔案,或者超過30秒的音訊檔案,可以使用AVAudioPlayer類。這個類定義在AVFoundation framework中。
下面我們使用這個類播放一個mp3的音訊檔案。首先要引入AVFoundation framework,然後MediaPlayerViewController.h中新增下面程式碼:
#import<</span>AVFoundation/AVFoundation.h>@interface MediaPlayerViewController : UIViewController <</span>AVAudioPlayerDelegate>
{
IBOutlet UIButton *audioButton;
SystemSoundID shortSound;
AVAudioPlayer *audioPlayer;
AVAudioPlayer類也是需要知道音訊檔案的路徑,使用下面程式碼建立一個AVAudioPlayer例項:
- (id)init
{
self = [super initWithNibName:@"MediaPlayerViewController" bundle:nil];
if (self) {
NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"Music"
ofType:@"mp3"];
if (musicPath) {
NSURL *musicURL = [NSURL fileURLWithPath:musicPath];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL
error:nil];
[audioPlayer setDelegate:self];
}
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Sound12"
ofType:@"aif"];
我們可以在一個button的點選事件中開始播放這個mp3檔案,如:
- (IBAction)playAudioFile:(id)sender
{
if ([audioPlayer isPlaying]) {
// Stop playing audio and change text of button [audioPlayer stop];
[sender setTitle:@"Play Audio File"
forState:UIControlStateNormal];
}
else {
// Start playing audio and change text of button so
// user can tap to stop playback [audioPlayer play];
[sender setTitle:@"Stop Audio File"
forState:UIControlStateNormal];
}
}
這樣執行我們的程式,就可以播放音樂了。
這個類對應的AVAudioPlayerDelegate有兩個委託方法。一個是 audioPlayerDidFinishPlaying:successfully: 當音訊播放完成之後觸發。當播放完成之後,可以將播放按鈕的文字重新回設定成:Play Audio File
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag
{
[audioButton setTitle:@"Play Audio File"
forState:UIControlStateNormal];
}
另一個是audioPlayerEndInterruption:,當程式被應用外部打斷之後,重新回到應用程式的時候觸發。在這裡當回到此應用程式的時候,繼續播放音樂。
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player
{
[audioPlayer play];
}