最近看了《中國有嘻哈》聽了Bridge的那首《老大》有點中毒,把以前在學校時寫的音樂播放器Demo重新修改了一下,花了10元錢在淘寶去做了這首歌的伴奏,不過還是很坑,聽了勿噴。下面進入正題
先來兩張效果圖壓壓驚,感覺個人審美還是不錯的
老大
老大大
代碼我在這里只貼幾個部分功能,下面??有Demo下載鏈接,歌曲、伴奏、歌詞里面都有,還望喜歡的朋友給個Stare?
引用庫
引用庫
AudioManager.h文件
// 伴奏
#define kBackGroundMusic @"老大伴奏"
// 原聲
#define KBackGroundMusic1 @"Bridge - 老大"
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface AudioManager : NSObject
@property (nonatomic, strong) NSArray *musicArray;
@property (strong, nonatomic) AVAudioPlayer *musicPlayer;
+(instancetype)defaultManager;
- (BOOL)playMusic:(NSString *)musicFileName;
//-(NSArray *)musicArray;
-(void)pause;///<暫停后繼續播放 回到最初
-(void)stop;
-(BOOL)play;
-(BOOL)isPlaying;
AudioManager.m文件
#import "AudioManager.h"
@interface AudioManager()
@end
@implementation AudioManager
+(instancetype)defaultManager
{
static AudioManager *manager = nil;
@synchronized(self) {
if (!manager) {
manager = [[AudioManager alloc] init];
}
}
return manager;
}
-(BOOL)playMusic:(NSString *)musicFileName
{
NSURL *musicURL = [[NSBundle mainBundle]URLForResource:musicFileName withExtension:@"mp3"];
if(!musicURL)
{
return NO;
}
NSError *error = nil;
self.musicPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:musicURL error:&error];
if(error)
{
NSLog(@"播放文件%@出錯,錯誤為%@",musicFileName,error);
}
// self.musicPlayer.numberOfLoops = -1;///<音樂循環播放
[self.musicPlayer play];
return YES;
}
-(void)pause
{
[self.musicPlayer pause];
}
-(void)stop
{
[self.musicPlayer stop];
// self.musicPlayer.currentTime = 0;
}
-(BOOL)play
{
if([self.musicPlayer prepareToPlay])
{
[self.musicPlayer play];
return YES;
}
return NO;
}
-(BOOL)isPlaying
{
return self.musicPlayer.isPlaying;
}
暫停/播放、上一首、下一首按鈕點擊事件
#pragma mark - 點擊左鍵事件
- (IBAction)leftBtn:(UIButton *)sender
{
[self playPrev];
}
#pragma mark - 點擊右鍵事件
- (IBAction)rightBtn:(UIButton *)sender
{
[self playNext];
}
// 切換播放、暫停按鈕
- (void) resumeOrPause{
if(self.isPlayer.selected == YES)
{
self.isPlayer.selected = NO;
[[AudioManager defaultManager]stop];
}
else if(self.isPlayer.selected == NO)
{
self.isPlayer.selected =YES;
[[AudioManager defaultManager]play];
}
}
歌詞解析
/**
* 解析歌詞
*/
-(void)parselyric
{
if([self.musicName.text isEqualToString:KBackGroundMusic1])
{
self.lyricPath = [[NSBundle mainBundle]pathForResource:@"老大歌詞" ofType:@"lrc"];///<歌詞文件路徑
}
else if([self.musicName.text isEqualToString:kBackGroundMusic])
{
self.lyricPath = [[NSBundle mainBundle]pathForResource:@"老大歌詞" ofType:@"lrc"];
}
if ([self.lyricPath length]) {
//get the lyric string
NSString *lyc = [NSString stringWithContentsOfFile:self.lyricPath encoding:NSUTF8StringEncoding error:nil];
//init
_musictime = [[NSMutableArray alloc]init];
_lyrics = [[NSMutableArray alloc]init];
self.musictime = [NSMutableArray arrayWithCapacity:0];
self.lrcDic = [NSMutableDictionary dictionaryWithCapacity:0];
NSArray *array = [lyc componentsSeparatedByString:@"\n"];
for (int i = 0; i < array.count; i++)
{
NSString *lineString = [array objectAtIndex:i];
NSArray *lineArray = [lineString componentsSeparatedByString:@"]"];
if ([lineArray[0] length] > 7) {
NSString *str1 = [lineString substringWithRange:NSMakeRange(3, 1)];
NSString *str2 = [lineString substringWithRange:NSMakeRange(6, 1)];
if ([str1 isEqualToString:@":"]&&[str2 isEqualToString:@"."])
{
//截取歌詞和時間;
NSString *timeStr = [lineString substringWithRange:NSMakeRange(1, 5)];
NSString *lrcStr = [lineString substringFromIndex:10 ];///<歌詞字符串
[self.musictime addObject:timeStr];
[self.lrcDic setObject:lrcStr forKey:timeStr];
}
}
}
}
}
鎖屏后臺播放
授權
在AppDelegate中注冊后臺播放
AVAudioSession *session = [AVAudioSession sharedInstance];
if ([session setCategory:AVAudioSessionCategoryPlayback error:nil]) {
if ([session setActive:YES error:nil]) {
NSLog(@"后臺播放準備完畢");
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}
在每一首音樂切換的時候調用
- (void)configPlayingInfo{
if(NSClassFromString(@"MPNowPlayingInfoCenter")){
NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"Bridge - 老大" forKey:MPMediaItemPropertyTitle];
[dict setObject:@"Bridge" forKey:MPMediaItemPropertyArtist];
[dict setObject:[[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"Bridge"]] forKey:MPMediaItemPropertyArtwork];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nil];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];
}
}
AVAudioPlayerDelegate
#pragma mark - AVAudioPlayerDelegate
/**
* 自動播放下一首
*/
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[self playNext];
}
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error
{
// 解碼失敗,自動播放下一首
[self playNext];
}
// 音樂播放器被打斷 (如開始 打、接電話)
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
// 會自動暫停 do nothing ...
NSLog(@"audioPlayerBeginInterruption---被打斷");
}
// 音樂播放器打斷終止 (如結束 打、接電話)
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
// 手動恢復播放
[player play];
NSLog(@"audioPlayerEndInterruption---打斷終止");
}
耳機線控
- (void)remoteControlReceivedWithEvent:(UIEvent*)event{
if(event.type == UIEventTypeRemoteControl){
switch(event.subtype){
case UIEventSubtypeRemoteControlTogglePlayPause:
[self resumeOrPause];
// 切換播放、暫停按鈕
break;
case UIEventSubtypeRemoteControlPreviousTrack:
[self playPrev];
// 播放上一曲按鈕
break;
case UIEventSubtypeRemoteControlNextTrack:
[self playNext];
// 播放下一曲按鈕
break;
default:
break;
}
}
}
Demo下載地址 喜歡的記得給個Stare? 歡迎大家提交建議
我想在跑車里 想要一輛法拉利
我是Renjiee 我要做最騷的程序猿??????