iPhone播放音乐
今天我们简要介绍如何在iPhone中播放音乐:
强烈建议你参考官方文档(需要登录):
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
首先,加入:
#import <AVFoundation/AVFoundation.h>
其次:
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
// MusicPlayer
//
// Created by HuTao on 8/8/12.
// Copyright __MyCompanyName__ 2012. All rights reserved.
//
#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];
[self updateSoundAt:0.0f];
}
}
-(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
{
UISlider * slider = (UISlider *)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];
}
@end
有几点说明:
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.
运行结果如下:
最后我把代码也上传上来了:
完成!