iOS音樂播放器(歌詞自動滾動)

來源:互聯網
上載者:User

標籤: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音樂播放器(歌詞自動滾動)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.