天天看點

iPhone播放音樂

iPhone播放音樂

今天我們簡要介紹如何在iPhone中播放音樂:

強烈建議你參考官方文檔(需要登入):

<a href="http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html%23//apple_ref/doc/uid/TP40008067">http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html%23//apple_ref/doc/uid/TP40008067</a>

1.

打開XCode,建立一個Window-based Application,項目名稱是MusicPlayer:

iPhone播放音樂
iPhone播放音樂

2.

打開MainWindow.xib,按下圖加入控件:

iPhone播放音樂

其中,最上面是兩個Label,左邊的Current(sec)始終不變,右邊的0顯示目前已播放的時間,下面是一個Slider,類似與一般播放器的進度條,再下面是音量調節的Slider,它們的min都是0.0,max都是1.0。最底下是兩個Button。

3.

由于播放聲音需要用到AVFoundation.framework,是以我們将它加入到我們的工程中:

iPhone播放音樂

右擊Frameworks,選擇Add/Existing Frameworks,加入AVFoundation:

iPhone播放音樂

4.

打開MusicPlayerAppDelegate.h,修改如下:

//  

//  MusicPlayerAppDelegate.h  

//  MusicPlayer  

//  Created by HuTao on 8/8/12.  

//  Copyright __MyCompanyName__ 2012. All rights reserved.  

#import &lt;UIKit/UIKit.h&gt;  

#import &lt;AVFoundation/AVFoundation.h&gt;  

@interface MusicPlayerAppDelegate : NSObject &lt;UIApplicationDelegate&gt;  

{  

    UIWindow * window;  

    IBOutlet UIButton * btnPlay;  

    IBOutlet UILabel * labelVolume;  

    IBOutlet UILabel * labelCurrentTime;  

    IBOutlet UISlider * sliderCurrentTime;  

    NSTimer * playTimer;  

    AVAudioPlayer * player;  

}  

@property (nonatomic, retain) IBOutlet UIWindow * window;  

@property (nonatomic, retain) IBOutlet UIButton * btnPlay;  

@property (nonatomic, retain) IBOutlet UILabel * labelVolume;  

@property (nonatomic, retain) IBOutlet UILabel * labelCurrentTime;  

@property (nonatomic, retain) IBOutlet UISlider * sliderCurrentTime;  

-(IBAction)soundStartOrPause:(id)sender;  

-(IBAction)soundStop:(id)sender;  

-(IBAction)volumeChanged:(id)sender;  

-(IBAction)currentTimeChanged:(id)sender;  

-(void)updateSoundAt:(float)percent;  

-(void)updateCurrentTime;  

-(void)initPlayer;  

@end  

首先,加入:

其次:

btnLabel,labelVolume,labelCurrentTime,sliderCurrentTime都是控件對應的Outlet:

btnLabel:在點選了Start按鈕後文本需要變成Pause,是以我們給Button也增加了一個Outlet;

labelVolume,labelCurrentTime:在滑動Slider時對應的Label也需要變化以反應目前值;

sliderCurrentTime:歌曲播放時需要通過Slider來反應目前已播放的時間,是以Slider也需要一個Outlet。

之後的playerTimer會每一定時間運作一次,根據目前已播放的時間更新進度條;AVAudioPlayer是AVFoundation提供的播放音樂的一個類。

之後的四個IBAction分别是:按下Start按鈕;按下Stop按鈕;滑動音量的Slider;滑動已播放時間的Slider對應的Action。

5.

打開MusicPlayerAppDelegate.m,修改如下:

//  MusicPlayerAppDelegate.m  

#import "MusicPlayerAppDelegate.h"  

@implementation MusicPlayerAppDelegate  

@synthesize window;  

@synthesize btnPlay;  

@synthesize labelVolume;  

@synthesize labelCurrentTime;  

@synthesize sliderCurrentTime;  

#pragma mark -  

#pragma mark Application lifecycle  

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

    //初始化AVAudioPlayer  

    [self initPlayer];  

    [window makeKeyAndVisible];  

    return YES;  

-(void)initPlayer  

    NSString * path = [[NSBundle mainBundle] pathForResource:@"北京歡迎你" ofType:@"mp3"];  

    //判斷是否找到該音樂檔案    

    if (path)  

    {  

        NSLog(@"Init sound");  

        //用path路徑初始化AVAudioPlayer  

        player = [[AVAudioPlayer alloc]initWithContentsOfURL:[[NSURL alloc]initFileURLWithPath:path]error:nil];  

        //初始化播放器    

        [player prepareToPlay];    

        //設定播放循環次數:如果numberOfLoops為負數 音頻檔案就會一直循環播放下去    

        player.numberOfLoops = -1;    

        //設定音頻音量:volume的取值範圍在[0.0f, 0.1f]之間    

        player.volume = 0.5f;  

        //将目前播放進度調為0  

        [self updateSoundAt:0.0f];  

    }  

-(void)updateSoundAt:(float)percent  

    float atTime = (player ? player.duration * percent : 0.0f);  

    NSString * time = [NSString stringWithFormat:@"%d", (int)atTime];  

    labelCurrentTime.text = time;  

    sliderCurrentTime.value = percent;  

-(IBAction)soundStartOrPause:(id)sender  

    //點選Start按鈕後開始播放音樂    

    if(player)     

        UIButton * btn = (UIButton *)sender;  

        if(![player isPlaying])     

        {  

            NSLog(@"Start sound");  

            [player play];  

            [btn setTitle:@"Pause" forState:UIControlStateNormal];  

            if(!playTimer)  

            {  

                playTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateCurrentTime) userInfo:nil repeats:YES];  

            }  

        }  

        else  

            NSLog(@"Pause sound");  

            [player pause];  

            [btn setTitle:@"Start" forState:UIControlStateNormal];  

    }    

-(void)updateCurrentTime  

    [self updateSoundAt:1.0 * player.currentTime / player.duration];  

-(IBAction)soundStop:(id)sender  

    //停止播放聲音    

    if(player)  

        NSLog(@"Stop sound");  

        player.currentTime = 0;  

        [player stop];  

        [btnPlay setTitle:@"Start" forState:UIControlStateNormal];  

}    

-(IBAction)volumeChanged:(id)sender  

    UISlider * slider = (UISlider *)sender;  

    NSString * value = [[NSString alloc]initWithFormat:@"%d%%", (int)(slider.value * 100)];  

    labelVolume.text = value;  

    player.volume = slider.value;  

    [value release];  

-(IBAction)currentTimeChanged:(id)sender  

    int time = (player ? slider.value * player.duration : 0);  

    player.currentTime = time;  

    [self updateSoundAt:slider.value];  

- (void)dealloc  

    [window release];  

    [btnPlay release];  

    [labelVolume release];  

    [labelCurrentTime release];  

    [sliderCurrentTime release];  

    [super dealloc];  

有幾點說明:

1.先将要播放的音樂加入到Resouces中;

2. playTimer定時器每0.5秒運作一次,更新目前的進度條;

6.

下面要開始将控件和IBOutlet以及IBAction相連接配接了:

(a)

打開MainWindow.xib,按住Ctrl鍵,滑鼠從Music Player Delegate上拖動到相應的Label上,将它和IBOutlet相連接配接:

iPhone播放音樂

  要注意的是不要忘了連接配接btnStart!一共要連兩個Slider,兩個Label和一個Button。

(b)

右鍵Button,選擇Touch Up Inside,将後面的小圓圈拖動到Music Player Delegate上,連接配接相應的IBAction:

iPhone播放音樂

要注意的是Slider需要連接配接ValueChanged事件:

iPhone播放音樂

7.

運作結果如下:

iPhone播放音樂

最後我把代碼也上傳上來了:

<a href="http://download.csdn.net/detail/htttw/4484442">http://download.csdn.net/detail/htttw/4484442</a>

本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/p/3498355.html,如需轉載請自行聯系原作者