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的可以留言。

时间: 2024-08-08 17:53:39

iOS音乐播放器(歌词自动滚动)的相关文章

一个功能齐全的IOS音乐播放器应用源码

该源码是在ios教程网拿过来的,一个不错的IOS音乐播放器应用源码,这个是我当时进公司时 我用了一晚上写的  图片都是在别的地方扒的,主要是歌词同步,及上一曲,下一曲,功能齐全了 ,大家可以学习一下吧.<ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op> 详细说明:http://ios.662p.com/thread-1599-1-1.html

iOS音乐播放器相关

iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌曲,只不过该播放器播放网络歌曲是先将歌曲下载下来再进行播放) 下面记录一下相关要用到的方法 1.获取本地歌曲库(ipod路径)歌曲 // 读取本地音乐 MPMediaPropertyPredicate *albumNamePredicate = [MPMediaPropertyPredicate p

卡拉OK效果的实现-IOS音乐播放器

自己编写的音乐播放器偶然用到这个模块,发现没有思路,而且上网搜了搜,关于这方面的文章不是很多,没找到满意的结果,然后自己也是想了想,最终实现了这种效果,想通了发现其实很简单. 直接上原理: 第一种: 原理就是创建一个UILabel,设置一下UILabel的lineBreakMode属性为NSLineBreakByClipping(这样的话就是的内容过多的话就会不显示,所以UILabel的宽度设置成0,就会不显示内容,然后用定时器不断更改宽度,内容也就会不断地显示出来,覆盖掉原本的内容,字体颜色要

一个IOS音乐播放器源码

此代码是IOS一款播放器代码,自己闲来仿照主流播放器写的,该播放器支持各种格式播放,支持上一曲,下一曲,歌词同步播放,音量调节大小,快进,快退等功能,后续功能我会继续完善.代码仅供学习交流,如有写的不好,望各位海涵...希望对刚刚接触这块的童鞋有所帮助......js_op> 3. [图片] iOS 模拟器屏幕快照“2013-9-18 上午11.06.16”.png    <ignore_js_op> 4. [图片] iOS 模拟器屏幕快照“2013-9-18 上午10.58.17”.p

Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

Android音乐播放器(歌词.均衡器.收藏.qq5.0菜单.通知) 一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 下载地址:http://www.devstore.cn/code/info/1144.html 运行截图:     热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较

Xamarin.Android开发音乐播放器

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐. 先show一组界面啊,话说有图有真相啊: 项目结构如图: Lrc是歌词处理方法 MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

iOS 简单实用的音乐播放器,少年,自己做个歌单吧。。。。。。

我也不知道为什么突然会想写一下音乐播放器的,感觉应该挺好的玩,自己把自己喜欢的歌曲导出来,用程序加载跑 起来,那歌听起来必定很带感啊......不过那首Love Story被我听了无数遍......听吐了 各位看官有兴趣也可以听听.其实前期准备是很坑爹的,找歌词真的蛋疼啊. 废话不多说,老规矩,看成品先: 尼玛这东西占得空间太大了,录不了太多...... 先介绍吧 首先 做个播放器的界面出来,上面是个tableView来加载歌词,底部两个Slider,一个声音,一个进度,最底下三个Button.

iOS开发拓展篇—音频处理(音乐播放器2)

iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 2.两种方法的分析 可以使用模态的方法,添加一个控制器,让这个控制器和音乐播放控制器类进行关联,脱线,设置标识符且在cell的点击事件中执行segue即可. 步骤说明: (1)在storyboard中新拖入一个控制器,然后设置和playing控制器类相关联. (2)设置手动跳转 (3)设置segue

网页音乐播放器javascript实现,可以显示歌词

可以显示歌词,但是歌词和歌曲都要实现自己下载下来.只能播放一首歌,歌词还得是lrc格式的代码写的很罗嗦,急切希望帮改改CSS的代码?1.代码:<html >    <head>        <!--下面有很多style都是没用到的,但是我改不动了-->        <!--css觉得真是很麻烦-->        <style type="text/css">            audio            {