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:

2.
打開MainWindow.xib,按下圖加入控件:
其中,最上面是兩個Label,左邊的Current(sec)始終不變,右邊的0顯示目前已播放的時間,下面是一個Slider,類似與一般播放器的進度條,再下面是音量調節的Slider,它們的min都是0.0,max都是1.0。最底下是兩個Button。
3.
由于播放聲音需要用到AVFoundation.framework,是以我們将它加入到我們的工程中:
右擊Frameworks,選擇Add/Existing Frameworks,加入AVFoundation:
4.
打開MusicPlayerAppDelegate.h,修改如下:
//
// MusicPlayerAppDelegate.h
// MusicPlayer
// Created by HuTao on 8/8/12.
// Copyright __MyCompanyName__ 2012. All rights reserved.
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface MusicPlayerAppDelegate : NSObject <UIApplicationDelegate>
{
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相連接配接:
要注意的是不要忘了連接配接btnStart!一共要連兩個Slider,兩個Label和一個Button。
(b)
右鍵Button,選擇Touch Up Inside,将後面的小圓圈拖動到Music Player Delegate上,連接配接相應的IBAction:
要注意的是Slider需要連接配接ValueChanged事件:
7.
運作結果如下:
最後我把代碼也上傳上來了:
<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,如需轉載請自行聯系原作者