AVAudioPlayer实现音乐播放+歌词与播放进度同步
说明:.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实现音乐播放+歌词与播放进度同步相关推荐
- 用Java写LRC制作器,实现音乐播放和滑块条进度同步
最近两天,我第一次尝试用Java写一个GUI程序,写了个LRC文件编辑器.简单地说,就是先导入歌,然后导入歌词(顺序可以颠倒,导入歌词可以用复制粘贴代替),然后一边播放歌曲,一边添加时间标签.然后根据 ...
- Vue3+TypeScript实现网易云音乐WebApp(播放界面:播放、暂停、音量控制、播放进度控制(点击/拖拽进度条)、上一首、下一首)
1. 成果展示 真实接口地址 本项目使用的是真实线上的网易云API 线上演示地址 目前只做了每日推荐(需登录)以及排行榜功能,点个star吧大佬们! 项目GitHub地址 main分支是Vue3+Ty ...
- 编写一个歌词随音乐播放滚动的播放器
提问:你平常都是如何听歌和下载歌曲的?官网?软件? 简介:作为计算机的爱好者,对计算的使用已经是非常熟悉了解的了,当然对编程语言也是有些许了解.听周围人说,无法听取某些歌曲或下载某些歌曲,身为脚本小子 ...
- android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...
Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...
- 音乐播放器中期总结(类似于qq音乐的歌词显示)
在前期总结中,我写了多个类控制一个ui界面,事实无须如此.可以把你想要让ui界面下的某个部分让某个类去做,只需要将ui->widget传进该类的构造函数中即可,然后就可以在这个ui部分上为所欲为 ...
- android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面
android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面 处理:二号三方apk沟通,三方apk在7.1.1上做相应的适配, 这个和android7.1.1 ...
- 用JS实现歌词与播放音乐同步
用JS实现歌词与播放音乐同步 第一步:把歌词解析成JS对象 参看我的上一篇文章:用JS解析LRC格式的歌词 解析后的歌词写到页面的一个列表中,效果如下: 主要HTML代码: <!-- 播放器 - ...
- 网易云歌词居中滚动、点击/滑动进度条对应滚动、当前播放歌词高亮
当前播放歌词高亮:根据当前播放时间,和歌词时间对比,获得当前歌词行数索引正常居中滚动.点击/滑动进度条对应滚动:(1)因为这几种方式都是改变当前播放时间,所以只需要根据当前播放时间操作即可(2)根据当 ...
- 安卓实现天天动听音乐播放歌词悬浮哦(转)
无意间在群里看到有朋友问过如何实现歌词悬浮等问题,再加小马本身也好奇这个是怎么实现的,所以专门找了下这方面的文章,找到一篇我本人觉得不错的文章,所以转来与大家分享咯,呵,开始咱们的歌词悬浮实现: 小述 ...
- Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)
1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...
最新文章
- 前端面试之Vue向技巧总结
- DeepFake疑遭审查
- 机器学习(二) 如何做到Kaggle排名前2%
- 【RK PX30】 瑞芯微四核64位工业级芯片PX30 | 安卓核心板
- Django Cookie于Session
- 根据HTML5 获取当前位置的经纬度【百度地图】【高德地图】
- C++对象的赋值和复制
- 从入门到精通:卷积神经网络初学者指南
- 给ListView视图添加行号
- stm32f107ptp时钟同步
- 迁移学习(Transfer)
- 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded解决方法
- 分别编写计算球的表面积和体积的函数area和volume。在主函数中输入球的半径,分别调用函数area和volume计算并输出球的表面积和体积。
- python爬虫58同城租房
- Python爬虫编程实践--task01
- 思维导图工具之Mindmeister
- chrome查看请求加载时间
- python自动化测试实战下载_Selenium 2自动化测试实战:基于Python语言 (虫师著) 完整pdf扫描版[44MB]...
- GO语言GET安装问题{cccccccccccccccccccc}
- 推理理论中的推理规则(离散数学)