iOS 模仿QQ音乐用Xcode写的一个播放器

**

我使用AvPlayer写的,所以大家一定得记住要导入AvFoundation的库,话不多说,直接上代码

**

这里我是把AvPlayer封装到了一个类里,

//
//  CXPlayMvViewController.m
//  LeeMusic
//
//  Created by ChuXiang on 15/12/9.
//  Copyright © 2015年 ChuXiang. All rights reserved.
//

#import "LoveMusicPlayer.h"
#import <AVFoundation/AVFoundation.h>
@implementation LoveMusicPlayer

+ (LoveMusicPlayer *)sharePlayer{
    static LoveMusicPlayer* Player = nil;
    if (Player==nil) {
        Player =[[LoveMusicPlayer alloc] init];
    }
    return Player;
}

- (void)playWithURL:(NSString *)url{
    AVPlayerItem * item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:url]];
    [self replaceCurrentItemWithPlayerItem: item];
    [self play];
}
@end

这里是在ViewController里完成的代码,我是直接找了一个音乐播放器的歌单的Url然后在这里请求数据的。
其实做起来也没那么难,AvPlayer它本身就有很多方法供大家使用,比如从url中获取歌曲总长(不过大家它给的时间是以秒为单位的,大家别忘了把它化成分秒,下面我也写到,大家可以参考),比如播放器音量,直接跟你写的音量slider绑定到一起等等。大家可以慢慢看,先把页面铺完(歌曲的图片转动我为了偷工减料就直接用计时器写了,看起来有点Low),再把该完成的方法写了就完事了。

//
//  ViewController.m
//  PlayMusic
//
//  Created by ChuXiang on 16/1/3.
//  Copyright © 2016年 ChuXiang. All rights reserved.
//

#import "ViewController.h"
#import "LoveMusicPlayer.h"
#import "CXSingListModel.h"
#import <AVFoundation/AVFoundation.h>
#import "UIImageView+WebCache.h"
#import "CXNetWorkTool.h"
#define kWidth ([UIScreen mainScreen].bounds.size.width / 375)
#define kHeight ([UIScreen mainScreen].bounds.size.height / 667)
#define kControlBarHeight 300
#define kControlBarCenterY (kScreenHeight - 150)

#define kScreenWidth [UIScreen mainScreen].bounds.size.width

#define kScreenHeight [UIScreen mainScreen].bounds.size.height

#define kControlBarOriginY (kScreenHeight - kControlBarHeight)

#define kMusicInfoOriginY (kControlBarOriginY + 40)

#define kControlBarCenterX self.view.center.x
#define kControlBarCenterY (kScreenHeight - 150)
#define kButtonOffsetX 120
#define kFindMusicGetURL @"http://a.vip.migu.cn/rdp2/v5.5/index.do?ua=Iphone_Sst&version=4.2421&pageno=1"


@interface ViewController () <UIScrollViewDelegate>
//处理音乐数据
@property (nonatomic, copy) NSString *songId;
@property (nonatomic, retain) NSMutableArray *myArr;
@property (nonatomic, assign) NSInteger index;
@property (nonatomic, strong)  CXSingListModel *model;

// 播放器
@property (nonatomic, retain) LoveMusicPlayer *player;

@property (nonatomic, assign) BOOL isPlaying;
//播放列表属性
@property (nonatomic, retain) UIImageView *myImageView;
@property (nonatomic, retain) UIButton *playButton;
@property (nonatomic, retain) UILabel *authorSongLabel;
@property (nonatomic, retain) UILabel *songNameLabel;
@property (nonatomic, retain) UISlider *slider;
@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic, retain) NSTimer *imgTimer;
@property (nonatomic, retain) UIImageView *backImage;
@property (nonatomic, retain) UILabel *timeLable;
@property (nonatomic, retain) UILabel *currentTimeLable;
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIPageControl *pageControl;
@property (nonatomic, retain) UISlider *volumeSlider;

//判断播放状态
@property (nonatomic, assign) NSInteger type;


//播放状态的枚举
typedef NS_ENUM(NSUInteger, PlayType) {
    PlayTypeLive = 0,
    PlayTypeNext,
    PlayTypeLast
};


@end

@implementation ViewController

static ViewController *single = nil;
// 单例执行 只初始化一次
+ (instancetype) shareSingleViewController {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //  在多线程中保证只初始化一次
        single = [[ViewController alloc] init];
    });
    return single;
}

//网络请求数据
- (void)getWithUrl:(NSString *)url parameter:(NSDictionary *)parameter withKey:(NSString *)key WithValue:(NSString *)value{
    self.myArr = [NSMutableArray arrayWithCapacity:0];
    [CXNetWorkTool getWithUrl:url parameter:nil httpHeader:nil responseType:ResponseTypeJSON success:^(id result) {
        if (result) {
            NSDictionary *dic = result;
            NSArray *array = dic[@"groups"];
            NSDictionary *dic1 = array[3];
            NSArray *array1 = dic1[@"songs"];
            for (NSDictionary *dic in array1) {
                CXSingListModel *model = [[CXSingListModel alloc] initWithDictionary:dic];
                [self.myArr addObject:model];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                [self createMusicData];
            });

        }
    }
        fail:^(NSError *error) {
//                NSLog(@"%@", error);
    }];

}



- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self getWithUrl:kFindMusicGetURL parameter:nil withKey:nil WithValue:nil];

    self.view.backgroundColor = [UIColor whiteColor];

    //    播放背景图片
    self.backImage = [[UIImageView alloc] initWithFrame:self.view.frame];
    //    上部分高亮显示
    UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];
    effectview.frame = CGRectMake(0, 0, self.backImage.frame
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值