標籤:ios 音樂播放器 歌詞解析
簡單實現基於IOS的音樂播放器,並且帶有歌詞,隨播放自動滾動,實現效果如下:
首先,需要建立一個解析歌詞的類ZMPlrc,解析歌詞主要就是把時間和對應的歌詞分離出來,然後儲存到數組中。
ZMPlrc.h
#import <Foundation/Foundation.h>@interface ZMPlrc : NSObject/** 時間 */@property (nonatomic,strong)NSMutableArray *timeArray;/** 歌詞 */@property (nonatomic,strong)NSMutableArray *wordArray;/** 解析歌詞 */- (void)parselrc;@end
ZMPlrc.m
#import "ZMPlrc.h"@implementation ZMPlrc- (instancetype)init{ self = [super init]; if (self) { _timeArray = [NSMutableArray array]; _wordArray = [NSMutableArray array]; } return self;}/** 歌詞路徑 */- (NSString *)getLrcPath{ return [[NSBundle mainBundle] pathForResource:@"梁靜茹-偶陣雨" ofType:@"lrc"];}/** 解析歌詞 */- (void)parselrc{ NSString *content = [NSString stringWithContentsOfFile:[self getLrcPath] encoding:NSUTF8StringEncoding error:nil]; NSArray *sepArray = [content componentsSeparatedByString:@"["]; for (int i = 5; i < sepArray.count; i ++) { //有兩個元素,一個是時間,一個是歌詞 NSArray *arr = [sepArray[i] componentsSeparatedByString:@"]"]; //NSLog(@"%@",sepArray[i]); [_timeArray addObject:arr[0]]; [_wordArray addObject:arr[1]]; } //NSLog(@"%@",content);}@end
接著,在storyboard中添加必要的控制項。
最後,就可以在控制器中實現了ZMPViewController,在實現過程中,主要就是監聽音頻播放player的播放時間,跟之前解析好的每句歌詞對應的時間進行處理。
ZMPViewController.h
#import <UIKit/UIKit.h>@interface ZMPViewController : UIViewController@property (weak, nonatomic) IBOutlet UITableView *lrcTableView;@property (weak, nonatomic) IBOutlet UISlider *timeSlider;@property (weak, nonatomic) IBOutlet UILabel *currentTimeLabel;@property (weak, nonatomic) IBOutlet UILabel *totalTimeLabel;@property (weak, nonatomic) IBOutlet UIButton *lastMusicBtnClick;- (IBAction)playBtnClick:(UIButton *)sender;- (IBAction)preMusicBtnClick:(id)sender;- (IBAction)valueChange:(UISlider *)sender;- (IBAction)nextMusicBtnClick:(id)sender;@end
ZMPViewController.m
#import "ZMPViewController.h"#import <AVFoundation/AVFoundation.h>#import "ZMPlrc.h"@interface ZMPViewController ()<UITableViewDataSource,UITableViewDelegate>{ //音樂播放器 AVAudioPlayer *player; ZMPlrc *lrc; NSInteger currentRow;}@end@implementation ZMPViewController- (void)viewDidLoad{ [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. [self initPlayer]; //偵聽目前時間 [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateTime) userInfo:nil repeats:YES]; lrc = [[ZMPlrc alloc] init]; [lrc parselrc]; [self.lrcTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"]; [self.lrcTableView reloadData]; }- (void)updateTime{ CGFloat currentTime = player.currentTime; // self.currentTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",(int)currentTime / 60, (int)currentTime % 60]; self.timeSlider.value = currentTime / player.duration; for (int i = 0; i < lrc.timeArray.count; i ++) { NSArray *arr = [lrc.timeArray[i] componentsSeparatedByString:@":"]; CGFloat compTime = [arr[0] integerValue]*60 + [arr[1] floatValue]; if (player.currentTime > compTime) { currentRow = i; } else { break; } } [self.lrcTableView reloadData]; [self.lrcTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:currentRow inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];}/** 初始化音樂播放器 */- (void)initPlayer{ //後台播放音頻設定 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; //讓app支援接受遠端控制事件 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; NSString *path = [[NSBundle mainBundle] pathForResource:@"梁靜茹-偶陣雨" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; //聲道 -1------左聲道,1-----右聲道 player.pan = 0; //音量:0~1 player.volume = 1; //單曲迴圈(負數表示單曲迴圈) player.numberOfLoops = -1; //速率(預設為1) //player.enableRate = YES; //player.rate = 1.0; //總時間 CGFloat totalSeconds = player.duration; self.totalTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",(int)totalSeconds / 60, (int)totalSeconds % 60]; //目前時間 player.currentTime; #if 0 //播放 [player play]; //停止 [player stop]; //暫停 [player pause];#endif }- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}- (IBAction)playBtnClick:(UIButton *)sender { sender.selected = !sender.selected; if (sender.selected) { [player prepareToPlay]; [player play]; }else{ [player pause]; }}- (IBAction)preMusicBtnClick:(id)sender { [self initPlayer];}- (IBAction)valueChange:(UISlider *)sender { player.currentTime = player.duration * sender.value;}- (IBAction)nextMusicBtnClick:(id)sender { [self initPlayer];}#pragma mark - TableViewDelegate- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return lrc.wordArray.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"]; if (indexPath.row == currentRow) { cell.textLabel.textColor = [UIColor redColor]; } else { cell.textLabel.textColor = [UIColor blackColor]; } cell.textLabel.textAlignment = NSTextAlignmentCenter; cell.textLabel.font = [UIFont systemFontOfSize:15]; cell.textLabel.text = lrc.wordArray[indexPath.row]; return cell;}@end
需要音樂在程式進入後台後同樣能夠播放,那麼在plist檔案中,增加Required background modes設定item 0的value為App plays audio or streams audio/video using AirPlay
並在控制器中,添加後台播放音訊設定
//後台播放音頻設定 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; //讓app支援接受遠端控制事件 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
另外,需要Demo的可以留言。
iOS音樂播放器(歌詞自動滾動)