说明:.lrc 歌词文件 + .mp3 音频文件

Demo

实现功能:
1.音乐播放/暂停
2.歌曲选择
3.播放进度,声音控制
4.歌词和播放进度同步

ViewController

import AVFoundation/AVFoundation.h
import “TQParserLrc.h”

@interface ViewController () UITableViewDataSource,UITableViewDelegate
- (IBAction)volumeChange:(id)sender;
- (IBAction)songChange:(id)sender;
- (IBAction)start:(id)sender;
@property (weak, nonatomic) IBOutlet UISlider *songSlider;
- (IBAction)preSong:(id)sender;
- (IBAction)nextSong:(id)sender;

@property (nonatomic,strong) NSTimer *timer;

@property (nonatomic,strong) AVAudioPlayer *audioPlayer;

@property (nonatomic,strong) NSArray *mp3PathArray;

@property (nonatomic,strong) NSArray *lrcPathArray;

@property (nonatomic) NSInteger currentMp3; //0

@property (nonatomic) NSInteger currentRow;

@property (nonatomic,strong) TQParserLrc *lrcObj;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation ViewController

-(void)initMp3:(NSString )mp3Path lrcPath:(NSString )lrcPath
{
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:mp3Path] error:nil];

//准备播放
[self.audioPlayer prepareToPlay];self.audioPlayer.volume = 0.5;[self.lrcObj parserLrc:lrcPath];//设置最大播放时间
self.songSlider.maximumValue = self.audioPlayer.duration;//    self.audioPlayer.enableRate = YES;
//    //速率
//    self.audioPlayer.rate = 2.0;self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(timeChange:) userInfo:nil repeats:YES];

}

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@”cell”];

    self.mp3PathArray = @[[[NSBundle mainBundle] pathForResource:@”梁静茹-偶阵雨” ofType:@”mp3”],[[NSBundle mainBundle] pathForResource:@”林俊杰-背对背拥抱” ofType:@”mp3”],[[NSBundle mainBundle] pathForResource:@”情非得已” ofType:@”mp3”]];

    self.lrcPathArray = @[[[NSBundle mainBundle] pathForResource:@”梁静茹-偶阵雨” ofType:@”lrc”],[[NSBundle mainBundle] pathForResource:@”林俊杰-背对背拥抱” ofType:@”lrc”],[[NSBundle mainBundle] pathForResource:@”情非得已” ofType:@”lrc”]];

    self.lrcObj = [[TQParserLrc alloc] init];

    [self initMp3:self.mp3PathArray[self.currentMp3] lrcPath:self.lrcPathArray[self.currentMp3]];

}

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

  • (IBAction)volumeChange:(UISlider *)sender {
    self.audioPlayer.volume = sender.value;
    }

  • (IBAction)songChange:(UISlider *)sender {
    //
    self.audioPlayer.currentTime = sender.value;
    }

//self.audioPlayer.currentTime 30

-(void)timeChange:(NSTimer *)t
{
self.songSlider.value = self.audioPlayer.currentTime;

for ( NSInteger i = 0; i < self.lrcObj.timeArray.count; i++ ) {NSString *timeString = self.lrcObj.timeArray[i];NSArray *sepTime = [timeString componentsSeparatedByString:@":"];CGFloat seconds = [sepTime[0] integerValue] * 60 + [sepTime[1] floatValue];if( seconds <= self.audioPlayer.currentTime ){//保存前一个元素的下表self.currentRow = i;}else{break;}
}[self.tableView reloadData];[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.currentRow inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

}

  • (IBAction)start:(id)sender {
    if(!self.audioPlayer.isPlaying)
    {
    [self.audioPlayer play];

    }
    else
    {
    [self.audioPlayer pause];
    //[self.timer invalidate];
    }
    }

  • (IBAction)preSong:(id)sender {
    [self.audioPlayer stop];
    [self.timer invalidate];

    self.currentMp3–;

    if (self.currentMp3 == -1) {
    self.currentMp3 = self.mp3PathArray.count - 1;
    }

    [self initMp3:self.mp3PathArray[self.currentMp3] lrcPath:self.lrcPathArray[self.currentMp3]];

    [self.audioPlayer play];
    }

  • (IBAction)nextSong:(id)sender {
    //
    [self.audioPlayer stop];
    [self.timer invalidate];

    self.currentMp3++;

    if (self.currentMp3 == self.mp3PathArray.count) {
    self.currentMp3 = 0;
    }

    [self initMp3:self.mp3PathArray[self.currentMp3] lrcPath:self.lrcPathArray[self.currentMp3]];

    [self.audioPlayer play];
    }

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.lrcObj.lrcArray.count;
}

-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”cell”];

cell.textLabel.text = self.lrcObj.lrcArray[indexPath.row];cell.textLabel.textAlignment = NSTextAlignmentCenter;if(self.currentRow == indexPath.row)
{cell.textLabel.textColor = [UIColor purpleColor];
}
else
{cell.textLabel.textColor = [UIColor blackColor];
}return cell;

}

TQParserLrc
.h
@interface TQParserLrc : NSObject

@property (nonatomic,strong) NSMutableArray *timeArray;

@property (nonatomic,strong) NSMutableArray *lrcArray;

-(void)parserLrc:(NSString *)lrcPath;

@end
.m
@implementation TQParserLrc

  • (instancetype)init
    {
    self = [super init];
    if (self) {
    self.timeArray = [[NSMutableArray alloc] init];

    self.lrcArray = [[NSMutableArray alloc] init];
    

    }
    return self;
    }

-(void)parserLrc:(NSString *)lrcPath
{

[self.lrcArray removeAllObjects];
[self.timeArray removeAllObjects];NSString *lrcContent = [NSString stringWithContentsOfFile:lrcPath encoding:NSUTF8StringEncoding error:nil];//@""
//time  lrc
NSArray *sepArray = [lrcContent componentsSeparatedByString:@"["];//00:02.07]偶阵雨 - 梁静茹  ---> sepString
for (NSString *sepString in sepArray) {NSArray *array = [sepString componentsSeparatedByString:@"]"];if(!([array[0] isEqualToString:@""] || [array[1] isEqualToString:@"\n"] || [array[1] isEqualToString:@"\r\n"])){[self.timeArray addObject:array[0]];[self.lrcArray addObject:array[1]];}
}

}

AVAudioPlayer实现音乐播放+歌词与播放进度同步相关推荐

  1. 用Java写LRC制作器,实现音乐播放和滑块条进度同步

    最近两天,我第一次尝试用Java写一个GUI程序,写了个LRC文件编辑器.简单地说,就是先导入歌,然后导入歌词(顺序可以颠倒,导入歌词可以用复制粘贴代替),然后一边播放歌曲,一边添加时间标签.然后根据 ...

  2. Vue3+TypeScript实现网易云音乐WebApp(播放界面:播放、暂停、音量控制、播放进度控制(点击/拖拽进度条)、上一首、下一首)

    1. 成果展示 真实接口地址 本项目使用的是真实线上的网易云API 线上演示地址 目前只做了每日推荐(需登录)以及排行榜功能,点个star吧大佬们! 项目GitHub地址 main分支是Vue3+Ty ...

  3. 编写一个歌词随音乐播放滚动的播放器

    提问:你平常都是如何听歌和下载歌曲的?官网?软件? 简介:作为计算机的爱好者,对计算的使用已经是非常熟悉了解的了,当然对编程语言也是有些许了解.听周围人说,无法听取某些歌曲或下载某些歌曲,身为脚本小子 ...

  4. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

  5. 音乐播放器中期总结(类似于qq音乐的歌词显示)

    在前期总结中,我写了多个类控制一个ui界面,事实无须如此.可以把你想要让ui界面下的某个部分让某个类去做,只需要将ui->widget传进该类的构造函数中即可,然后就可以在这个ui部分上为所欲为 ...

  6. android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面

    android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面 处理:二号三方apk沟通,三方apk在7.1.1上做相应的适配, 这个和android7.1.1 ...

  7. 用JS实现歌词与播放音乐同步

    用JS实现歌词与播放音乐同步 第一步:把歌词解析成JS对象 参看我的上一篇文章:用JS解析LRC格式的歌词 解析后的歌词写到页面的一个列表中,效果如下: 主要HTML代码: <!-- 播放器 - ...

  8. 网易云歌词居中滚动、点击/滑动进度条对应滚动、当前播放歌词高亮

    当前播放歌词高亮:根据当前播放时间,和歌词时间对比,获得当前歌词行数索引正常居中滚动.点击/滑动进度条对应滚动:(1)因为这几种方式都是改变当前播放时间,所以只需要根据当前播放时间操作即可(2)根据当 ...

  9. 安卓实现天天动听音乐播放歌词悬浮哦(转)

    无意间在群里看到有朋友问过如何实现歌词悬浮等问题,再加小马本身也好奇这个是怎么实现的,所以专门找了下这方面的文章,找到一篇我本人觉得不错的文章,所以转来与大家分享咯,呵,开始咱们的歌词悬浮实现: 小述 ...

  10. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

最新文章

  1. 前端面试之Vue向技巧总结
  2. DeepFake疑遭审查
  3. 机器学习(二) 如何做到Kaggle排名前2%
  4. 【RK PX30】 瑞芯微四核64位工业级芯片PX30 | 安卓核心板
  5. Django Cookie于Session
  6. 根据HTML5 获取当前位置的经纬度【百度地图】【高德地图】
  7. C++对象的赋值和复制
  8. 从入门到精通:卷积神经网络初学者指南
  9. 给ListView视图添加行号
  10. stm32f107ptp时钟同步
  11. 迁移学习(Transfer)
  12. 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded解决方法
  13. 分别编写计算球的表面积和体积的函数area和volume。在主函数中输入球的半径,分别调用函数area和volume计算并输出球的表面积和体积。
  14. python爬虫58同城租房
  15. Python爬虫编程实践--task01
  16. 思维导图工具之Mindmeister
  17. chrome查看请求加载时间
  18. python自动化测试实战下载_Selenium 2自动化测试实战:基于Python语言 (虫师著) 完整pdf扫描版[44MB]...
  19. GO语言GET安装问题{cccccccccccccccccccc}
  20. 推理理论中的推理规则(离散数学)

热门文章

  1. python爬虫学习爬取股票数据
  2. elementUI的tree组件搜索过滤,可识别拼音,且不区分大小写
  3. 2021 苟且活着,2022 向上生长
  4. h2o java_java – 在h2o中加载大于内存大小的数据
  5. 七层代理与四层代理区别
  6. 相机意外断电导致视频保存成DAT文件,无法播放,如何修复视频文件?
  7. 学而思python分几个level_学而思数学分几个等级
  8. WIN10家庭版虚拟机启动蓝屏问题
  9. 尚学堂JAVA基础学习笔记_1/2
  10. svm预测股价 python_python 利用SVM预测股票涨跌