1. 程式人生 > >新增按鈕聲音  播放聲音

新增按鈕聲音  播放聲音

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((

__bridge CFURLRef)url, &sound);

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];
}