iOS开发之网络音乐播放器(SC音乐)(一)
前言
一直都想做一款自己的网络音乐播放器,两个月前做了一个swift版的网络音乐播放器,但是那个播放器数据来源于我自己用VPS和nginx搭建的服务器,所有的文件都要自己准备,包括mp3、歌词、专辑图片等,非常麻烦,有兴趣的可以跟我要源码。现在这款音乐播放器数据是来源于百度音乐,前前后后花了一个多星期搞定,网上有一些音乐网站的API,有兴趣的同学可以去查一下。我这里贴一下我自己用到的百度音乐API:http://blog.youkuaiyun.com/zuiaisha1/article/details/61200422。
正题
一、播放控制
SC音乐用的是AVPlayer,这个库是苹果自带的视频库,也可以播放音频,可以支持边播放边缓存,使用也比较简单。详细看苹果官网介绍:https://developer.apple.com/documentation/avfoundation/avplayer。这里介绍一下要用到的东西。我们知道,播放器要有播放、暂停、上一曲、下一曲的功能,还要知道播放总时间,当前时间,播放状态,能够从歌曲的任意时间点开始播放。在AVPlayer库中:
play ---- 播放
pause ---- 暂停
rate ---- 播放状态(0.0代表当前状态是暂停, 1.0代表当前状态是播放)
seekToTime ---- 从某个时间点开始播放(拖动进度条用到)
duration ---- 歌曲总时间
currentTime ---- 当前播放时间
上一曲和下一曲可以通过改变歌曲url来实现。
初始化一个AVPlayer需要一个playItem,所以先初始化一个playItem,再用这个playItem去实例化一个play,具体代码:
MusicPlayerManager.h
//
// MusicPlayerManager.h
// BaiduMusic
//
// Created by 凌 陈 on 8/21/17.
// Copyright © 2017 凌 陈. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface MusicPlayerManager : NSObject
typedef enum : NSUInteger {
RepeatPlayMode,
RepeatOnlyOnePlayMode,
ShufflePlayMode,
} ShuffleAndRepeatState;
@property (nonatomic,strong) AVPlayer *play;
@property (nonatomic,strong) AVPlayerItem *playItem;
@property (nonatomic,assign) ShuffleAndRepeatState shuffleAndRepeatState;
@property (nonatomic,assign) NSInteger playingIndex;
+ (MusicPlayerManager *)sharedManager;
-(void) setPlayItem: (NSString *)songURL;
-(void) setPlay;
-(void) startPlay;
-(void) stopPlay;
-(void) play: (NSString *)songURL;
@end
MusicPlayerManager.m
//
// MusicPlayerManager.m
// BaiduMusic
//
// Created by 凌 陈 on 8/21/17.
// Copyright © 2017 凌 陈. All rights reserved.
//
#import "MusicPlayerManager.h"
@implementation MusicPlayerManager
static MusicPlayerManager *_sharedManager = nil;
+(MusicPlayerManager *)sharedManager {
@synchronized( [MusicPlayerManager class] ){
if(!_sharedManager)
_sharedManager = [[self alloc] init];
return _sharedManager;
}
return nil;
}
-(void) setPlayItem: (NSString *)songURL {
NSURL * url = [NSURL URLWithString:songURL];
_playItem = [[AVPlayerItem alloc] initWithURL:url];
}
-(void) setPlay {
_play = [[AVPlayer alloc] initWithPlayerItem:_playItem];
}
-(void) startPlay {
[_play play];
}
-(void) stopPlay {
[_play pause];
}
-(void) play: (NSString *)songURL {
[self setPlayItem:songURL];
[self setPlay];
[self startPlay];
}
@end
将一首歌的url传进play方法就可以实现播放音乐了。上一曲下一曲只是改变一下歌曲的url就可以实现。
歌曲总时长:
_play.currentItem.duration
当前播放时间:
_play.currentTime
从某个时间点开始播放:
//播放器定位到对应的位置
CMTime targetTime = CMTimeMake((int64_t)(currentTime), 1);
[musicPlayer.play seekToTime:targetTime];
播放状态: