iPhone播放音乐

iPhone播放音乐



今天我们简要介绍如何在iPhone中播放音乐:

强烈建议你参考官方文档(需要登录):

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html%23//apple_ref/doc/uid/TP40008067



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.

运行结果如下:





最后我把代码也上传上来了:

http://download.csdn.net/detail/htttw/4484442





完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据您的需求,可以使用C#中的面向对象概念来实现手机的相关参数和通用功能。具体实现如下: 1. 定义一个抽象类Phone,包含内存、处理器、屏幕等参数,并定义拨打电话、播放音乐等通用功能的抽象方法。 ```csharp public abstract class Phone { public int Memory { get; set; } public string Processor { get; set; } public string Screen { get; set; } public abstract void Call(); public abstract void PlayMusic(); } ``` 2. 定义一个普通类SmartPhone,继承自Phone类,并实现其抽象方法。同时,SmartPhone类还具备特性功能,如拍照、录像等。 ```csharp public class SmartPhone : Phone { public override void Call() { Console.WriteLine("拨打电话"); } public override void PlayMusic() { Console.WriteLine("播放音乐"); } public void TakePhoto() { Console.WriteLine("拍照"); } public void RecordVideo() { Console.WriteLine("录像"); } } ``` 3. 定义一个接口IFeature,包含特性功能的抽象方法。 ```csharp public interface IFeature { void TakePhoto(); void RecordVideo(); } ``` 4. 定义一个普通类IPhone,继承自SmartPhone类,并实现IFeature接口。IPhone类还具备特性功能,如Face ID等。 ```csharp public class IPhone : SmartPhone, IFeature { public void FaceID() { Console.WriteLine("Face ID"); } } ``` 通过上述实现,我们可以创建一个IPhone对象,并调用其继承自Phone类的通用功能,以及实现的IFeature接口的特性功能。 ```csharp IPhone iPhone = new IPhone(); iPhone.Call(); // 输出:拨打电话 iPhone.TakePhoto(); // 输出:拍照 iPhone.FaceID(); // 输出:Face ID ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值