歌词同步的实现(lrc)
2009-02-28 16:07
211 查看
lrc是一种开放的文件格式,用来实现歌词和音乐的同步显示。用文字编辑器打开lrc文件会很容易发现,几乎每行都包含有如[*:*]的格式,称之为标签。标签分为两种,一种如[3:12.78]类的称为时间标签,表示与音乐同步的时间,精确到0.01秒;另一种如[ar:xxx]类的称为标识标签,表示一些附加的信息,如歌曲家,歌词编辑者等等,没特别需要,将其忽略。
所以,同步主要是对时间标签的处理。我的步骤如下:
1、由于lrc文件本身不大,将其一次性读入内存
2、由于lrc每行为歌词的一行内容,讲lrc文件分解为每行的内容
3、对各行处理,获得时间,歌词内容
4、按照时间的先后顺序排序,做成一张按时间从小到大的表
5、正常常音乐播放时,获取当前播放时间与当前时间表节点比较,当大于当前节点时间时,显示下条歌词,时间节点下移一个节点
6、拖动进度条播放时,定位播放时间和表中的时间节点,显示相关条目
用到的主要数据结构和方法:
总结:用链表方法来保存歌词比较复杂,拖动播放时歌词定位效率不高(即使可以通过一些简单的时间点判断来提高效率),但总的来说,还没有到影响显示效果的程度。可以考虑利用数组来保存歌词条目,这样就可以用二分法等一些有效率的算法来提高效率,呵呵,当然有利也有弊,预留数组的大小会浪费一些内存,如果文件过大而预留大小过小会造成内存访问非法的操作。LRC定位歌词不像KRC那样高,可以精确到每个字,而且还包含一些专辑图片等信息。(看来多思考一步,多向前走一步,就是另外一片天地啊!)
所以,同步主要是对时间标签的处理。我的步骤如下:
1、由于lrc文件本身不大,将其一次性读入内存
2、由于lrc每行为歌词的一行内容,讲lrc文件分解为每行的内容
3、对各行处理,获得时间,歌词内容
4、按照时间的先后顺序排序,做成一张按时间从小到大的表
5、正常常音乐播放时,获取当前播放时间与当前时间表节点比较,当大于当前节点时间时,显示下条歌词,时间节点下移一个节点
6、拖动进度条播放时,定位播放时间和表中的时间节点,显示相关条目
用到的主要数据结构和方法:
typedef struct _LRC{ int nLine; double time; TCHAR* chars; _LRC *next; }LRC; //歌词条目 TCHAR* GetFileBuf(TCHAR *wsFileName);//读取文件 void AnalyseLrc();//分析每行内容,建立时间表 void SetOrder();//排序
总结:用链表方法来保存歌词比较复杂,拖动播放时歌词定位效率不高(即使可以通过一些简单的时间点判断来提高效率),但总的来说,还没有到影响显示效果的程度。可以考虑利用数组来保存歌词条目,这样就可以用二分法等一些有效率的算法来提高效率,呵呵,当然有利也有弊,预留数组的大小会浪费一些内存,如果文件过大而预留大小过小会造成内存访问非法的操作。LRC定位歌词不像KRC那样高,可以精确到每个字,而且还包含一些专辑图片等信息。(看来多思考一步,多向前走一步,就是另外一片天地啊!)
相关文章推荐
- Android自定义View来实现解析lrc歌词同步滚动、上下拖动、缩放歌词等功能
- 歌词文件LRC的解析,可用于音乐播放器实现歌词同步操作
- Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能[转]
- 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
- Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
- Android 实现歌曲播放时歌词同步显示
- Android开发----lrc歌词的同步展示
- js实现音频歌词同步
- AVAudioPlayer实现音乐播放+歌词与播放进度同步
- AJAX集天气\IP\多国语言翻译MP3(可同步LRC歌词显示)\万年历查询通
- 手机影音第十七天,实现歌词同步
- Android 实现歌词同步
- Android实现歌曲播放时歌词同步显示具体思路
- Android 实现歌曲播放时歌词同步显示
- Android 音乐播放器 实现歌词同步
- amarok2实现同步歌词功能
- android 音乐播放器-------歌词同步 lrc
- jquery+jplayer实现歌词同步的mp3音乐播放器效果
- android手机音乐播放器实现歌词同步
- Android 实现歌词同步