AVAudioPlayerDemo

本文介绍了一个简单的iOS音乐播放器应用程序的实现过程,包括创建工程、界面布局、音乐列表选择及播放控制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先导入框架AVFoundation.framework(记得在使用寻找音乐路径的时候要修改音乐的名字)

创建一个空的工程 再创建两个类 AudioPlayerViewController 和 ChoiceAudiViewController

在application文件中添加的代码如下 记得要导入ChoiceAudiViewController

ChoiceAudiViewController *choiceVC = [[ChoiceAudiViewController alloc]init];

    

    UINavigationController *navigationC = [[UINavigationController alloc]initWithRootViewController:choiceVC];

    

    self.window.rootViewController = navigationC;


ChoiceAudiViewController.h文件中的代码如下

#import <UIKit/UIKit.h>


@interface ChoiceAudiViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>


@property (retain,nonatomic) NSArray *musicArr;


@end

ChoiceAudiViewController.m添加的代码


#import "ChoiceAudiViewController.h"

#import "AudioPlayerViewController.h"


@interface ChoiceAudiViewController ()


@end


@implementation ChoiceAudiViewController

- (void)dealloc

{

    [_musicArr release];

    [super dealloc];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

        self.title = @"音乐列表";

    }

    return self;

}


- (void)viewDidLoad

{

    [super viewDidLoad];

    self.musicArr = [NSArray arrayWithObjects:@"test",@"123",@"hinder",@"The Sound Of Silence",nil];

    

    UITableView *myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 450) style:UITableViewStylePlain];

    myTableView.delegate = self;

    myTableView.dataSource = self;

    [self.view addSubview:myTableView];

    

    [myTableView release];

    

}

#pragma marks --- datasource ---

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.musicArr.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    NSString *identifier = @"identifier";

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    

    if (cell == nil)

    {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

    }

    

    cell.textLabel.text = [self.musicArr objectAtIndex:[indexPath row]];

    

    return cell;

}

#pragma marks --- UITable view delegate ---

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    AudioPlayerViewController *audioVC = [[AudioPlayerViewController alloc]init];

    audioVC.selectedMucicName = [self.musicArr objectAtIndex:[indexPath row]];

    [self.navigationController pushViewController:audioVC animated:YES];

    

    [audioVC release];

}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


AudioPlayerViewController.h文件中添加的代码

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>


@interface AudioPlayerViewController : UIViewController<AVAudioPlayerDelegate>


@property (copy,nonatomic) NSString *selectedMucicName;


@property (retain,nonatomic) AVAudioPlayer *audiPlayer;


@property (retain,nonatomic) NSTimer *timer;


@property (assign,nonatomic) BOOL playState;


@end

AudioPlayerViewController.m文件中的代码


enum{

    BUTTON_TAG = 1,

    LABEL1_TAG,

    LABEL2_TAG,

    SLI_VOICE_TAG,

    SLI_SONG_TAG

};

#import "AudioPlayerViewController.h"


@interface AudioPlayerViewController ()


@end


@implementation AudioPlayerViewController


- (void)dealloc

{

    [_audiPlayer release];

    [_timer release];

    [_selectedMucicName release];

    [super dealloc];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        

    }

    return self;

}


- (void)viewDidLoad

{

    [super viewDidLoad];

    self.title = self.selectedMucicName;

    

    UIButton *audioButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    audioButton.frame = CGRectMake(120, 80, 80, 40);

    audioButton.tag = BUTTON_TAG;

    [audioButton setTitle:@"play" forState:UIControlStateNormal];

    [audioButton addTarget:self action:@selector(playAndPauseBtnPress:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:audioButton];

    

    //显示播放进度的标签

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 160, 120, 30)];

    label.text = @"00:00 of 00:00";

    label.tag = LABEL1_TAG;

    [self.view addSubview:label];

    [label release];

    

    //调节声音的进度条

    UISlider *voiceSlider = [[UISlider alloc]initWithFrame:CGRectMake(100, 220, 210, 20)];

    voiceSlider.tag = SLI_VOICE_TAG;

    [self.view addSubview:voiceSlider];

    [voiceSlider release];

    

    //当声音进度改变时调用的方法

    [voiceSlider addTarget:self action:@selector(volumeChange:) forControlEvents:UIControlEventValueChanged];

    

    UILabel *voicelabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 220, 85, 20)];

    voicelabel.text = @"音量:";

    [self.view addSubview:voicelabel];

    [voicelabel release];

    

    UISlider *songSlider = [[UISlider alloc]initWithFrame:CGRectMake(100, 280, 210, 20)];

    songSlider.thumbTintColor = [UIColor greenColor];

    songSlider.tintColor = [UIColor redColor];

    [songSlider setThumbImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];;

    songSlider.tag = SLI_SONG_TAG;

    [self.view addSubview:songSlider];

    [songSlider release];

    

    UILabel *songLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 280, 85, 20)];

    songLabel.text = @"播放进度:";

    [self.view addSubview:songLabel];

    [songLabel release];

    

    //当进度条进度改变时调用的方法

    [songSlider addTarget:self action:@selector(progressChange:) forControlEvents:UIControlEventValueChanged];

    //当进度条进度改变完成时调用的方法

    [songSlider addTarget:self action:@selector(progressDidChanged:) forControlEvents:UIControlEventTouchUpInside];

}


- (void)viewWillAppear:(BOOL)animated

{

    NSString *path = [[NSBundle mainBundle]pathForResource:self.selectedMucicName ofType:@"mp3"];

    NSURL *url = [[NSURL alloc]initFileURLWithPath:path];

    self.audiPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

    [url release];

    self.audiPlayer.delegate = self;

    self.audiPlayer.meteringEnabled = YES;

    [self.audiPlayer prepareToPlay];

    

    self.playState = NO;

}

- (void)viewWillDisappear:(BOOL)animated

{

    [self.audiPlayer stop];

    [self.audiPlayer release];

    self.audiPlayer = nil;

}

- (void)playAndPauseBtnPress:(id)sender

{

    UIButton *button = (UIButton *)[self.view viewWithTag:BUTTON_TAG];

    

    self.playState = !self.playState;

    

    if (self.playState)

    {

        [button setTitle:@"pause" forState:UIControlStateNormal];

        [self playMusic];

    }else

    {

        [button setTitle:@"play" forState:UIControlStateNormal];

        [self pauseMusic];

    }

}

- (void)playMusic

{

    [self.audiPlayer play];

    

    UISlider *voice = (UISlider *)[self.view viewWithTag:SLI_VOICE_TAG];

    UISlider *song = (UISlider *)[self.view viewWithTag:SLI_SONG_TAG];

    UILabel *timeLAable = (UILabel *)[self.view viewWithTag:LABEL1_TAG];

    

    [voice setEnabled:YES];

    [song setEnabled:YES];

    [timeLAable setEnabled:YES];

    

    voice.value = self.audiPlayer.volume;

    

    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateMeters) userInfo:nil repeats:YES];

}

                  

- (void)pauseMusic{

    [self.audiPlayer pause];

    

    UISlider *voice = (UISlider *)[self.view viewWithTag:SLI_VOICE_TAG];

    UISlider *song = (UISlider *)[self.view viewWithTag:SLI_SONG_TAG];

    

    [self.timer invalidate];

    

    [voice setEnabled:NO];

    [song setEnabled:NO];

    

}

                  

- (void)updateMeters

{

    [self.audiPlayer updateMeters];

    

    UISlider *song = (UISlider *)[self.view viewWithTag:SLI_SONG_TAG];

    song.value = self.audiPlayer.currentTime/self.audiPlayer.duration;

    

    UILabel *timeLabel = (UILabel *)[self.view viewWithTag:LABEL1_TAG];

    timeLabel.text = [NSString stringWithFormat:@"%@ of %@",[self formateTime:self.audiPlayer.currentTime],[self formateTime:self.audiPlayer.duration]];

    

}

-(NSString *)formateTime:(NSTimeInterval)_time{

      int num = (int)_time;

      int min = num / 60;

      int sec = num % 60;

      if (num < 60) {

          return [NSString stringWithFormat:@"0:%2d",sec];

      }else{

          return [NSString stringWithFormat:@"%2d:%2d",min,sec];

      }

}

- (void)volumeChange:(id)sender

{

    UISlider *slider = (UISlider *)[self.view viewWithTag:SLI_VOICE_TAG];

    slider.value = self.audiPlayer.volume;

}

- (void)progressChange:(id)sender

{

    [self.audiPlayer pause];

    

    UISlider *song =(UISlider *)[self.view viewWithTag:SLI_SONG_TAG];

    UILabel *timeLable = (UILabel *)[self.view viewWithTag:LABEL1_TAG];

    

    song.value = self.audiPlayer.duration * song.value;

    

    timeLable.text = [NSString stringWithFormat:@"%@ of %@",[self formateTime:self.audiPlayer.currentTime],[self formateTime:self.audiPlayer.duration]];

}

- (void)progressDidChanged:(id)sender

{

    [self.audiPlayer play];

}

#pragma marks --- AVAudioPlayer delegate ---

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

{

    UISlider *voice = (UISlider *)[self.view viewWithTag:SLI_VOICE_TAG];

    UISlider *song = (UISlider *)[self.view viewWithTag:SLI_SONG_TAG];

    

    voice.enabled = NO;

    song.enabled = NO;

    

    UIButton *btn = (UIButton *)[self.view viewWithTag:BUTTON_TAG];

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

}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值