本地音乐播放

#import <UIKit/UIKit.h>
#import "AllMusicModel.h"
@interface PlayViewController : UIViewController

@property (nonatomic,strong) AllMusicModel *model;
@end


#import "PlayViewController.h"
#import "PlayView.h"
//要想使用封装好的音频类,导入框,导入类头文件,缺一不可;
#import <AVFoundation/AVFoundation.h>
@interface PlayViewController () <AVAudioPlayerDelegate>
{
    //播放器类
    AVAudioPlayer *player;
    //定时器
    NSTimer *timer;
    //总体界面
    PlayView *play;
    //判断有没有歌词
    BOOL isIrcOrNot;
   
    //定时器
    NSTimer *timer2;
    int a;
    
}
@end

@implementation PlayViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    a = 1;
    //解决跳转过程一闪一闪的现象,因为MusicPlayViewController默认是透明色
    //设置背景色
    self.view.backgroundColor = [UIColor grayColor];
    
    self.title = self.model.name;
    
    //将导航条设置为不透明(iOS7以后默认是透明的)
    self.navigationController.navigationBar.translucent = NO;
    
    //视图布局
    play = [[PlayView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:play];
    
    [play.playBtn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    //左边label表示的当前时间,通过模型传值
    play.label1.text = self.model.name;
    //右边的label表示音乐总共时间
    play.label2.text = self.model.singer;
    
    //获取?mp3路径
    NSString *path = [[NSBundle mainBundle] pathForResource:self.model.url ofType:nil];
    //这是获取本地路径
    NSURL *url = [NSURL fileURLWithPath:path];
    //初始化播放器
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    //播放次数,0表示只播放一次,1表示播放2次,往后依次。。。
    player.numberOfLoops = 0;
    //调整声道,-1、0、1分别为左声道,立体声,右声道
    player.pan = 0;
    //该属性设置为yes后,才能设置rate属性和prepareToPlay属性
    player.enableRate = YES;
    //0.5、1、2分别表示播放速度减半,正常,加倍。
    player.rate = 1.0f;
    
    //准备播放
    [player prepareToPlay];
    
    //设置当前播放时间和音乐总时间
    play.currentTime.text = @"00:00";
    

    //player.duration是音乐总共持续的秒数
    //转化为音乐一共有多少分钟
    int mint = player.duration / 60;
    //剩余的秒数
    int second = (int)(player.duration) % 60;
    NSString *mintStr , *secondStr;
    //冒号左边的分钟:转化格式,一位数的话,前面加0,两位数的话,不加
    if(mint < 10)
    {
        mintStr = [NSString stringWithFormat:@"0%d",mint];
    }
    else
    {
        mintStr = [NSString stringWithFormat:@"%d",mint];
    }
    //冒号右边的秒数,同上
    if(second < 10)
    {
        secondStr = [NSString stringWithFormat:@"0%d",second];
    }
    else
    {
        secondStr = [NSString stringWithFormat:@"%d",second];
    }
    
    //合并冒号两边的分钟和秒数
    play.duration.text = [NSString stringWithFormat:@"%@:%@",mintStr,secondStr];
    //手动滑动滑条,会出发事件,注意用UIControlEventValueChanged
    [play.slider addTarget:self action:@selector(valueChage) forControlEvents:UIControlEventValueChanged];
    
}
//点击开始按钮,目标动作机制
- (void)click:(UIButton *)startBtn
{
    //选中状态和非选中状态做取反处理
    //selected为yes显示选中图片,为no显示普通图片
    startBtn.selected = !startBtn.selected;
    //如果按钮没选中
    if(startBtn.selected == NO)
    {
        //暂停播放音乐
        [player pause];
        
    }
    //如果选择,播放音乐
    else [player play];
    //设置一个定时器,有三个参数,没0.1秒都会在本对象中(self)重复(YES)执行sliderMove方法
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(sliderMove) userInfo:nil repeats:YES];
    //定时器开始执行,默认会fire,所以可以不写
    //[timer fire];
    
    
    timer2 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(sliderStart) userInfo:nil repeats:YES];
}
//定时器每1秒触发的方法
- (void)sliderStart
{
    
    a++;
    NSString *mintStr , *secondStr;
    
    int mint = a / 60;
    int second = a % 60;
    if (second<10)
    {
        secondStr = [NSString stringWithFormat:@"0%d",second];
        NSLog(@"mintStr = %@",mintStr);
    }
    else
    {
        secondStr = [NSString stringWithFormat:@"%d",second];
        NSLog(@"mintStr = %@",mintStr);
    }

    if (mint <10)
    {
        mintStr = [NSString stringWithFormat:@"0%d",mint];
    }
    else
    {
        mintStr = [NSString stringWithFormat:@"%d",mint];
    }
    
    //设置当前播放时间和音乐总时间
    play.currentTime.text = [NSString stringWithFormat:@"%@:%@",mintStr,secondStr];
}
//定时器每0.1秒触发的方法
- (void)sliderMove
{
    //滑条的进度没0.1秒会变化,进度值是开始的时候0,结束的是1,当前进度值是,音乐播放的当前时间除以音乐的总共时间
    play.slider.value = player.currentTime / player.duration;
}

//手动滑动滑条时触发的方法
- (void)valueChage
{
    //音乐播放的当前时间进度=音乐总时间乘以滑条的进度值(0-1)
    player.currentTime = player.duration * play.slider.value;
}

//当界面退出时,将定时器停止,播放器关掉,节约内存
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [timer invalidate];
    [timer2 invalidate];
    [player stop];
    
}

@end


转载于:https://my.oschina.net/suyongchen/blog/648279

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值