2020-04-07-乐乐音乐:Android音乐播放器及动感(KTV)歌词相关博客汇总

相关简介

Java Swing PC版本乐乐音乐播放器

乐乐音乐PC播放器单机版本,支持ape,wav,flac,mp3等多种格式,支持动态ksc、hrc、krc歌词文件和支持和显示翻译歌词和音译歌词,支持多语言歌词,是一款不错的java swing音乐播放器。

Android版本乐乐音乐播放器

乐乐音乐主要是基于ijkplayer框架开发的Android音乐播放器,它支持多种音频格式(mp3音频,ape音频,flac音频,wav音频等)、lrc歌词和动感(KTV歌词)歌词(ksc歌词,krc歌词,hrc歌词、trc歌词、网易云API歌词等)、翻译和音译歌词和桌面歌词及制作动感歌词、翻译歌词和音译歌词,以及MV和字幕功能。界面高仿酷狗。

HPLyrics(动感歌词解析和歌词显示库:支持音译、翻译歌词和制作动感(KTV)歌词)

该开源依赖库是乐乐音乐播放器里的一个音频模块功能,支持lrc歌词、ksc歌词、krc歌词、trc歌词、网易云API歌词和hrc歌词等歌词格式的显示,支持动感歌词制作。

HPAudio(音频解析库:支持wav、mp3、ape、ogg、wv和flac)

该开源依赖库是乐乐音乐播放器里的一个音频模块功能,主要是Android解析wav、mp3、ape、ogg、wv和flac的声道数、采样率、时长等信息。

Subtitle(字幕库)

乐乐音乐播放器最近添加了MV功能,由于部分MV没有字幕,所以这里为乐乐音乐播放器添加一个外挂字幕的开源库,目前该开源库主要简单支持srt和ass字幕文件。

参考博客资料

github

简书

CSDN

apkbus

Read More

Android Srt和Ass字幕解析器

简介

乐乐音乐播放器最近添加了MV功能,由于部分MV没有字幕,所以这里为乐乐音乐播放器添加一个外挂字幕的开源库,目前该开源库主要简单支持srt和ass字幕文件。

字幕显示方式

{\fn华文楷体\fs16\1c&H3CF1F3&\b1}影片壓制

转换

<font color="#F3F13C"><b>影片壓制</b></font>

显示方式主要是以html的方式显示,所以现在只支持读取字幕文本、html文本、颜色和加粗等基本功能,没有特效。

字幕格式解析

正则表达式

  • 时间标签

    \d+:\d+:\d+,\d+

  • 分隔出每一项font标签

      <font color="#F3F13C"榮譽出品==--</font>
    

    (<font[^<]+>)(<[bius]>)[^<]+(</[bius]>)(</font>)

  • 分隔出字幕内容

    <font color="#FF00FF"><b><u>http://cmct.cc</u></b></font>

    ((<font[^<]+>)(<[bius]>)* (</[bius]>)*(</font>))
  • 分隔ass

       Dialogue: 0,0:00:02.00,0:00:07.00,Default,,0000,0000,0001,,{\fn华文楷体\fs16\1c&H3CF1F3&\b0}--==本影片由 {\1c&HFF8000&\b1}CMCT 团队{\fn华文楷体\1c&H3CF1F3&\b0} 荣誉出品==--\N更多精彩影视 请访问 {\fnCronos Pro Subhead\1c&HFF00FF&\b1}http://cmct.cc{\r}
    

    Dialogue\S\s+\d+,\d+:\d+:\d+.\d+,\d+:\d+:\d+.\d+,\S+,

srt字幕

SRT字幕的颜色以及一些特效的设置

ass字幕

ASS字幕格式规范

预览图

srt字幕

ass字幕

Gradle

1.root build.gradle

`allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}`

2.app build.gradle

dependencies { implementation 'com.github.zhangliangming:Subtitle:v1.2' }

混淆注意

-keep class com.zlm.subtitlelibrary.** { *; }

调用Demo

链接: https://pan.baidu.com/s/1j-4wbtiNIfRhypb4uEnX6g 提取码: t8dj

声明

该项目的代码和内容仅用于学习用途

项目地址

https://github.com/zhangliangming/Subtitle.git

Read More

浅谈动感歌词:网易云歌词分析

1引言

HPLyrics歌词解析库虽然是乐乐音乐播放器中的一个歌词模块,但是目前已经支持lrc、ksc、krc、hrc等歌词格式的动感显示。最近有读者反映该开源库能否支持网易云歌词,如果要支持网易云歌词,需知道该歌词的格式。

2网易云歌词分析

参考歌词API地址 从API返回的歌词信息,分析网易云歌词的格式。

2.1动感歌词

[ti:喜欢你]
[ar:黄耀明]
[28571,5548](0,1297)细(0,252)雨(0,312)带(0,376)风(0,312)湿(0,376)透(0,312)黄(0,435)昏(0,689)的(0,752)街(0,431)道
[34882,4550](0,550)抹(0,188)去(0,188)雨(0,376)水(0,246)双(0,441)眼(0,377)无(0,372)帮(0,939)地(0,499)仰(0,371)望

从动感歌词格式可知,[]里面的是歌曲标签内容,歌词行:[此行开始时刻距0时刻的毫秒数,此行持续的毫秒数](0,此字持续的毫秒数)歌(0,此字持续的毫秒数)词(0,此字持续的毫秒数)正(0,此字持续的毫秒数)文

2.2Lrc歌词(翻译歌词)

和普通lrc歌词的分析一样,这里不做分析

3不足

从API返回的数据,可以看到,动感歌词或者翻译歌词每个歌词都含有ti、ar等歌曲标签信息,可以看成一个独立的歌词文件来看。HPLyrics库为了适配其它的歌词,将网易云中的动感歌词(或者lrc歌词)和翻译歌词整合成了一个歌词文件,导致了lrc歌词(或者动感歌词)信息丢失。

Read More

乐乐音乐6.0全新改版-支持制作歌词

简介

乐乐音乐6.0主要是基于ijkplayer框架开发的Android音乐播放器,它支持多种音频格式和动感歌词及制作动感歌词、翻译歌词和音译歌词。

运行环境

android5.0及以上

音频格式

目前用ijkplayer来测试如下音频格式,均可正常播放:aac,amr,ape,flac,m4r,mmf,mp2,mp3,ogg,wav,wma,wv

歌词格式

lrc:普通歌词、 krc:酷狗歌词 、ksc:卡拉OK歌词 hrc:happy lyrics歌词,乐乐音乐自定义的动感歌词格式,可准确到歌词每个字。 网易云API歌词:该歌词只适用于通过api获取歌词,文件保存格式为:lrcwy。其中动感歌词和lrc歌词只能选其中一种,支持翻译歌词 注:其中krc和hrc歌词支持音译和翻译歌词

功能

  1. 制作动感歌词、翻译歌词和音译歌词
  2. 支持动感歌词、多行歌词、歌词快进、歌词时间微调、歌词换行、字体大小、歌词颜色切换和歌词透明度上下渐变、多行歌词平滑移动,快速流畅滑动。
  3. 歌曲在线缓存并播放
  4. 旋转界面、侧边栏、底部播放菜单固定

部分效果图

声明

仅用于学习用途

项目地址

https://github.com/zhangliangming/HappyPlayer5.git

Read More

Android仿酷狗SlidingMenuLayout界面实现

引言

该SlidingMenuLayout主要实现了左边侧边栏、主界面和多个Fragment功能。该控件主要是参考酷狗界面的功能,左侧菜单可设置缩放动画,及打开多个Fragment功能。该控件在后期会整合到乐乐音乐播放器项目中去。

需求

  • 侧边栏
  • 处理与viewpager控件的冲突
  • 多个Fragment功能

预览图

实现思路

源码

具体的代码和调用Demo,可到源码地址处查看:

Android仿酷狗SlidingMenuLayout界面实现

最后

如果有问题,可到github上面留言。

Read More

2018-05-13-浅谈动感歌词:hrc歌词

hrc歌词

hrc是英文happy lyrics的缩写,是乐乐音乐播放器中自定义使用的歌词文件扩展名,它的歌词显示是精确到每个字,并且除了包含歌曲、歌手信息等信息还包含音译歌词和翻译歌词。

格式

基本标签

[ar:歌手名]、[ti:歌曲名]、[by:编辑者(指歌词的制作人)]、[offset:时间补偿值] (其单位是毫秒,正值表示整体提前,负值相反)[total:歌曲时间长度]

其它标签

haplayer.tag[hash:]

额外歌词标签

haplayer.extra.lrc({音译歌词和翻译歌词Json格式的Base64字符串});

歌词标签

歌词标签格式分两种,一种是普通歌词;另外一种是高潮歌词,因为高潮部分歌词大部分为重复歌词,可归纳为一行处理。

普通歌词标签

haplayer.lrc('<{行开始时间:单位ms},{行结束时间:单位ms}>','<{字}><{字}>','<{字持续时间}>');

高潮部分歌词标签

haplayer.lrc('<{行开始时间:单位ms},{行结束时间:单位ms}><{行开始时间:单位ms},{行结束时间:单位ms}>','<{字}><{字}>','<{字持续时间}><{字持续时间}>');

歌词明文

制作

HRC歌词文件是通过乐乐歌词制作器或者乐乐播放器把歌词按照歌曲歌词字出现的时间编辑到一起的,然后在乐乐歌词制作器或者乐乐播放器上面将歌曲与歌词同步显示出来。 当然也可以使用乐乐播放器来对KRC、KSC和TRC等动感歌词格式转换成HRC歌词格式。

开发标准

  • 制作歌词时,一定要使用相关的歌词制作器或者歌词转换器
  • 每个标签占一行,不支持一行多个标签
  • 尽量不要空行
  • 编码格式统一使用UTF-8

词的处理

通过InputStream的方式加载歌词文件,然后获取Byte再解压转字符串,然后再以”行“分隔来解析标签,最后排序。

相关软件

Java Swing PC版本乐乐音乐播放器

乐乐音乐PC播放器单机版本,支持ape,wav,flac,mp3等多种格式,支持动态ksc、hrc、krc歌词文件和支持和显示翻译歌词和音译歌词,支持多语言歌词,是一款不错的java swing音乐播放器。

Android版本乐乐音乐播放器

乐乐音乐5.0主要是基于ijkplayer框架开发的Android音乐播放器,它支持多种音频格式(mp3,ape,flac,wav等)、lrc歌词和动感歌词(ksc,krc,hrc等)、翻译和音译歌词。

参考资料

Read More

2018-05-13-Android仿酷狗桌面悬浮歌词效果

引言

该悬浮歌词功能是乐乐音乐中的一个模块,主要是APP在后台运行时,在手机的桌面上出现一个歌词窗口,方便用户可以随时随地地查看歌词及操作APP,除了通知栏外,多提供了一个操作APP界面,其乐乐音乐项目地址:乐乐音乐

实现功能

  • 后台运行时,弹出悬浮窗口,非后台时,隐藏悬浮窗口
  • 可移动悬浮窗口位置
  • 桌面歌词的显示、字体、颜色、歌词锁定和歌词解锁
  • 进入主界面功能、操作歌曲播放、暂停等功能

预览图

原装正版

实现版

传送门

最后

如果有问题,可到github上面留言。

Read More

2018-04-30-ContentProvider封装SharedPreferences功能,解决跨进程存取值的问题

引言

之前项目使用了SharedPreferences来保存数据,然而项目修改为多进程后,SharedPreferences保存数据却出现了数据没有更新的问题,当然SharedPreferences设置了MODE_MULTI_PROCESS后可以使数据同步,不过官方已经废弃了原先的MODE_MULTI_PROCESS, 并且建议跨进程存取值还是用ContentProvider之类的更靠谱一些。

思路分析

由于ContentProvider提供了对底层数据存储方式的抽象,底层我们可以使用SQLite,MongoDB等等,当然也可以使用SharedPreferences来实现

调用用法

继承

声明

相关API

源码

参考

ContentProvider从入门到精通

http://bbs.51cto.com/thread-1070974-1.html

最后

如果有问题,可到github上面留言。

Read More

2018-04-30-Android解析wav、mp3、ape和flac的声道数、采样率、时长等信息

引言

该开源依赖库是乐乐音乐播放器里的一个音频模块功能,主要是解析wav、mp3、ape和flac歌曲信息,如:声道数、采样率、时间等信息,其项目地址如下:乐乐音乐播放器

调用用法

源码

参考

musique的Java audio player

Android音频开发

WAVE PCM soundfile format

各种WAV文件头格式

最后

如果有问题,可到github上面留言。

Read More

2018-04-01-Android动感歌词制作器(支持翻译和音译歌词)

引言

之前PC版本已经实现了动感歌词、翻译歌词和音译歌词的制作,便想着找个时间,把PC版本的功能移植到Android手机平台上面。经过一周的努力,终于实现了,界面虽然简陋,但是大部分的功能已经实现。为了开发方便,就将该动感歌词制作器嵌套到播放器里面了,其项目地址如下:乐乐音乐播放器

实现功能

入口

主界面

操作界面

动感歌词制作

注:制作动感歌词时,需要先播放歌曲,并且选中(RadioButton被选中,并且歌词出现红边框)要敲打的行歌词,然后便可以敲打。歌曲读到【字】,对应要敲打到该字,这样才可以保证歌曲与歌词几步,完成后,边框会变成蓝色,全部完成后,才可以进入预览视图。

翻译歌词制作

注:制作翻译歌词时,点击item列表,便会弹出输入翻译编辑框,只需要在输入框输入内容,便完成该行对应的翻译歌词,可不填写。

音译歌词制作

注:制作音译歌词时,点击item列表,便会弹出输入音译编辑框,输入音译歌词时,输入框下有01/04的进度提示,并且输入对应的【字】后,已经完成的【字】会变成蓝色,然后点击空格,进行分隔,不过这里为了兼容krc歌词格式(经常出现一个字包含多个歌词文字的情况),这里使用“∮”符号来替代空格。

思路分析

  • 制作动感歌词:当读到【A字】时,点击【敲打】按钮,记录当前的播放进度P1,当播放到下一个【B字】时,记录读到【B字】的播放进度P2,[P2-P1]的时间便是【A字】的时间间隔。
  • 制作翻译歌词:相对简单,直接在对应行输入翻译内容即可。
  • 制作音译歌词:对应歌词的每个【字】,输入音标即可。

源码

具体的代码和调用Demo,可到源码地址处查看: 乐乐音乐播放器

传送门

最后

如果有问题,可到github上面留言。

Read More

2018-03-25-Android歌词转换器(支持动感歌词相互转换)

引言

之前为了让乐乐音乐播放器支持多种歌词格式,在实现多种歌词格式解析的时,也想弄一个歌词转换器,由于网上Android版的还是比较少的,所以就将该转换器嵌套到播放器里面了,其项目地址如下:乐乐音乐播放器

实现功能

歌词转换器

  • 支持ksc、krc和hrc歌词间的相互转换及转换成lrc歌词
  • hrc歌词:乐乐音乐播放器自定义的动感歌词格式,如需制作歌词(支持动感歌词、翻译歌词和音译歌词制作),可点击链接查看:Hrc歌词制作器(乐乐音乐播放器PC版)

歌词图片生成器

  • 支持ksc、lrc、krc和hrc歌词
  • 歌词生成图片功能,本想生成视频的,手机太渣生成太耗时,就放弃了
  • 生成图片后,想用图片生成视频PC软件来生成视频,结果图片数量太多,软件都崩溃了,真是自作死
  • 若真需要生成视频,可使用【爱剪辑】的卡拉OK功能

预览图

主界面

歌词转换器

歌词图片生成器

思路分析

  • 歌词转换,其实就是先解析源歌词文件,再将解析得到的歌词内容和时间标签,根据要生成的歌词格式生成该格式的歌词文件。

源码

具体的代码和调用Demo,可到源码地址处查看: 乐乐音乐播放器

传送门

最后

如果有问题,可到github上面留言。

Read More

2018-03-03-Android仿酷狗动感歌词(支持翻译和音译歌词)显示效果

引言

该开源依赖库是乐乐音乐播放器里的一个歌词模块功能,现在把该功能模块独立出来进行优化,并弄成了一个开源依赖库,其它音乐播放器项目只要引用该库并调用接口,便可轻松实现与乐乐音乐播放器一样的动感歌词显示效果,其项目地址如下:乐乐音乐播放器

实现功能

歌词解析和生成

  • 支持krc、ksc、lrc歌词格式
  • hrc歌词:乐乐音乐播放器自定义的动感歌词格式,如需制作歌词(支持动感歌词、翻译歌词和音译歌词制作),可点击链接查看:Hrc歌词制作器(乐乐音乐播放器PC版)
  • 歌词格式可自行扩展和相互转换

双行歌词

  • 不支持lrc格式歌词的显示
  • 支持动感歌词、翻译歌词和音译歌词的显示
  • 歌词颜色渐变方面,主要是参考酷狗PC版桌面歌词的颜色【蓝-白-蓝】
  • 支持歌词字体大小、字体包、颜色、歌词换行等功能

多行歌词

  • 支持lrc、krc和hrc等动感歌词的显示
  • 支持动感歌词、翻译歌词和音译歌词的显示
  • 歌词颜色透明度渐变、歌词平滑移动、歌词快进
  • 支持歌词字体、颜色、歌词换行等功能
  • 动感歌词的翻译歌词,可分为lrc和动感(默认)两种方式绘画显示

预览图

主界面

歌词文件读取并预览

双行歌词-动感歌词

双行歌词-音译歌词

双行歌词-翻译歌词

多行歌词-lrc歌词

多行歌词-动感歌词

多行歌词-音译歌词

多行歌词-翻译歌词

多行歌词-快进

实现思路

歌词解析器和生成器

翻译歌词和音译歌词构建

翻译歌词和音译歌词里的字时间,只要从原始的歌词里面的字时间集合里重构,由于翻译歌词的字数和原始歌词不一定对应,所以翻译歌词每个字的渐变时间,为该行歌词时长除于字总数的平均值。具体可参考:浅谈动感歌词-歌词补充篇

动感歌词渐变效果

API:canvas.clipRect

双行歌词上下颜色渐变

API:LinearGradient,目前设置了上下颜色渐变,颜色是平均分布。

歌词刷新优化

  • 注意:从Handler.postDelayed(Runnable, 0)到Runnable里面的执行是有消耗时间的。
  • 旧版思路:乐乐音乐之前是通过线程每隔100ms便通过发送广播将歌曲的播放进度发给歌词类,让它去刷新歌词的内容,从而达到歌词与歌曲对应的效果,不过这几天优化的时候发现,每隔100ms更新并通过handler进行刷新时,其实还需要考虑handler从发送到执行请求时,所消耗的时间已经不止100ms,加上广播过于频繁,这应该就是乐乐音乐的歌词在渐变的时候不太流畅的原因。
  • 现在思路:乐乐音乐播放器加载完成歌词后,需要从player中将当前歌曲的播放进度(playProgress)传给歌词,之后歌词类便操作这个播放进度值(playProgress)去刷新界面,这里的思路是:每隔1ms,播放进度(playProgress)便要添加1ms。由于handler每次从发送到执行时,需要消耗时间,这里我直接使用该消耗时间作为播放进度的增加值,对歌词界面进行刷新,从而达到歌词与歌曲对应的效果。
  • 个人感觉,如果想歌词更新流畅,用C来实现,效果应该会比较好
  • 类似的,歌曲的进度条显示也可以使用该种方法。

源码

具体的代码和调用Demo,可到源码地址处查看: Android仿酷狗动感歌词(支持翻译和音译歌词)显示效果

传送门

扩展

  • 歌词格式转换器
  • 歌词文件生成视频

    最后

    如果有问题,可到github上面留言。

Read More

Android自定义view实现SeekBar

引言

该SeekBar由自定义view来实现,主要完成了普通的进度条(可修改进度条的颜色,游标颜色,二级进度条颜色等等),最后再在普通进度条的基础上实现了歌曲使用的进度条,可弹出窗口显示时间和歌词,该功能主要是在我的乐乐音乐播放器里面使用,其项目地址如下:https://github.com/zhangliangming/HappyPlayer5.git

需求

  • 完成SeekBar的基本功能
  • 扩展弹出窗口显示歌曲时间和歌词

    预览图

实现思路

  • 重写view的onDraw来绘画进度条和游标
  • 重写view的onTouchEvent来监听用户拖动游标或者拖动的事件
  • 拖动时,弹出窗口显示时间和歌词

主要代码分析

onDraw

onTouchEvent

源码

具体的代码和调用Demo,可到源码地址处查看: https://github.com/zhangliangming/SeekBar.git

最后

如果有问题,可到github上面留言。

Read More

Android仿酷狗旋转界面功能-自定义控件实现

引言

该旋转界面主要是仿照IOS酷狗版的旋转界面来实现,本项目通过结合ValueAnimator、Rotation、PivotX和PivotY来实现,目前主要实现了左旋转和右旋转,该功能主要是在我的乐乐音乐播放器里面使用,其项目地址如下:https://github.com/zhangliangming/HappyPlayer5.git

需求

  • 在界面上左右滑,View的角度根据手势移动。
  • 只拦截左右滑动,上下方向的滑动无影响。
  • 子View的左右滑动事件无影响。

    预览图

    实现思路

  • RotateLayout:左右旋转View
  • onInterceptTouchEvent:该方法只要做左右移动拦截,上下移动不拦截。
  • ValueAnimator:该动画只要改变RotateLayout View的角度位置,在ACTION_UP和界面打开时调用。
  • ACTION_MOVE时,根据移动的X位移,修改RotateLayout的角度。
  • 角度算法:先确定旋转view的旋转中心为Q(width/2,height*1.5),然后根据第一次触摸时,该触摸点在屏幕上面的AXY(ax,ay)坐标,根据A点和Q点,计算出该次的夹角A。滑动时,同理计算滑动时的BXY(bx,by)坐标,计算出B点和Q点的夹角B,通过B - A,可以得出view的旋转度数。计算夹角时,可以使用tan来计算,如果计算出来的夹角为负数时,需要+180来得到真正的夹角。
  • 注意,需要activity开启硬件加速,动画才流畅。

主要代码分析

onFinishInflate

该方法只要实现两种方式,一种是通过布局xml文件来初始化RotateLayout;另外一种是新new RotateLayout。

onLayout

该方法只要是在初始化成功之后,修改RotateLayout的角度。

onInterceptTouchEvent

该方法只要是拦截左右移动和判断是否在左右不拦截的子View集合里面。

onTouchEvent

该方法只要在用户左右移动的时候,修改RotateLayout的角度。

该方法只要是ACTION_UP的时候,需要判断当前RotateLayout当前的角度,如果小于关闭窗口的标志值,则角度还原0.否则关闭view.

源码

具体的代码和调用Demo,可到源码地址处查看: https://github.com/zhangliangming/RotateLayout.git

最后

如果有问题,可到github上面留言。

Read More

Android右滑关闭Activity界面功能-自定义控件实现

引言

Android右滑关闭Activity界面功能,网上已经有好多优秀的开源代码和项目,不过大部分都是结合ViewDragHelper来实现的,这里要讨论的是通过结合ValueAnimator来实现,目前我的控件只实现了从左往右(上往下)滑关闭界面。

需求

  • 在界面上从左往右滑,View位置根据手势移动。
  • 只拦截左右滑动,上下方向的滑动无影响。
  • 子View的左右滑动事件无影响。

    预览图

    实现思路

  • SwipeBackLayout:左右滑动View
  • onInterceptTouchEvent:该方法只要做左右移动拦截,上下移动不拦截。
  • ValueAnimator:该动画只要改变SwipeBackLayout View的位置,在ACTION_UP和界面打开时调用。
  • ACTION_MOVE时,根据移动的X位移,修改SwipeBackLayout View的位置。

    主要代码分析

    onFinishInflate

该方法只要实现两种方式,一种是通过布局xml文件来初始化SwipeBackLayout;另外一种是新new SwipeBackLayout。

onLayout

该方法只要是在初始化成功之后,修改SwipeBackLayout的位置。

onInterceptTouchEvent

该方法只要是拦截左右移动和判断是否在左右不拦截的子View集合里面。

onTouchEvent

该方法只要在用户左右移动的时候,修改SwipeBackLayout的位置。

该方法只要是ACTION_UP的时候,需要判断当前SwipeBackLayout的left位置,如果left位置小于屏幕的一半,则使用ValueAnimator动画,让SwipeBackLayout位置还原到正常位置。否则,关闭SwipeBackLayout。

dispatchDraw

该方法只要是在SwipeBackLayout移动的时候,绘画阴影。

源码

具体的代码和调用Demo,可到源码地址处查看:https://github.com/zhangliangming/SwipeBackLayout.git

最后

如果有问题,可到github上面留言。

Read More

浅谈动感歌词-歌词补充篇

1引言

之前写了几篇关于动感歌词的简单介绍,相信大家还有印象,这里就不多说了,这篇要说的是,关于翻译歌词和音译歌词,以及我在解析和显示这两种歌词的时候,遇到的一些难题、技术和心得。

2动感歌词格式

下面我简单说一下,关于翻译歌词和音译歌词保存在哪里的问题。因为我主要研究的是krc歌词,所以这里我会以krc解析为主。当然,我也根据自己的实际需求,自定义了一种歌词格式,方便自己使用,这里也会简单说一下,为了区分音译和翻译歌词,我把原来的歌词,称为:【原始歌词】,音译和翻译歌词统称【额外歌词】。

2.1krc歌词

krc歌词,分析篇也说了,虽然是加密了,但是也难不到万能的网友。以下是根据网上提示的算法,得到解密后的歌词内容:

锘�[id:$0145B5C5]
[ar:�跺お]
[ti:蹇��ㄥ����]
[by:]
[hash:fa8e1508c06761a9b82631f1cf7c3b54]
[al:]
[sign:]
[qq:]
[total:1230449]
[offset:0]
[language:eyJjb250ZW50IjpbeyJsYW5ndWFnZSII6MX0= 。。。。。。。。。。。(此处省略100字)。。。。。]
[28131,4758]<0,1302,0>璧�<1302,951,0>��<2253,401,0>��<2654,250,0>��<2904,1854,0>��
[33690,5705]<0,800,0>��<800,2152,0>浜� <2952,201,0>��<3153,249,0>��<3402,402,0>��<3804,199,0>��<4003,903,0>娴�<4906,799,0>��

对的,你看到的不是乱码,这是我为了找到有翻译和音译的krc歌词,而找的一份歌词(茶太 - 志在千里~恋姫喚作百花王~.krc),里面的乱码其实是日语来的,好了废话不多说,其实我们只要细心看便会看到歌词里,有一行:

[language:eyJjb250ZW50IjpbeyJsYW5ndWFnZSII6MX0= 。。。。。。。。。。。(此处省略100字)。。。。。] 是的,就是这一行,krc歌词里面的翻译歌词和音译歌词,都在这一行里面,看到这些abcd是不是好眼熟?对的,这些字符串,就是base64加密后的字符串。我们解密来看看,是什么东东,解密内容如下:

{"content":[{"language":0,"lyricContent":[["a","kaku","ne","nyu","ru"],["a","kanegumo","shi","zu","shi","zu","naga","ru"],。。。。(此处省略100字)。。。。。。。。。。。],"type":0},{"language":0,"lyricContent":[["\u71C3\u7684\u706B\u7EA2"],["\u7EC6\u7EC6\u6447\u66F3\u7684\u6697\u7EA2\u8272\u7684\u4E91\u6735\u9759\u9759\u6D41\u52A8"],["\u8EAB\u540E\u9668\u843D"]。。。。(此处省略100字)。。。。。。],"type":1}],"version":1}

从解密后的内容可以看到,type=0是音译歌词,type=1是翻译歌词,其中歌词中看不到与时间相关的标签,这是因为【原始歌词】中已经含有了时间的标签和精准到【字】的时间标签。翻译歌词相对简单,只需要与原始歌词的【行】对应即可。音译歌词,除了与原始歌词的【行】对应外,还与【行】歌词里的每个【字】相对应。

2.2hrcs歌词

该歌词格式是之前hrcx歌词的升级版。我们先回顾一下hrcx歌词的格式:

 [ti:右手戒指];
[total:272706];
[ar:金海心];
[offset:0];
[by:HappyPlayer-PC];
haplayer.lrc('<1270,9630>','金海[心 ][- ]右手戒指','<1010,780,830,1410,800,1210,1410,910>');
haplayer.lrc('<18710,19810>','[la ][la ][la ]','<300,400,400>');
haplayer.lrc('<20020,22840><77150,79970><163120,165840><191920,194740>','是你梦中的女郎','<200,300,400,300,510,500,610><310,400,300,510,400,400,500><200,510,400,400,410,500,300><210,400,300,400,400,510,600>');

从歌词格式内容,我们可以看到,在解析歌词的时候,我们还要费时去解析歌词行的每个【字】(最可怜的还是要判断该【字】是中文、英文、韩文还是日文,最变态的还是泰文),然后对歌词进行分割,得到【字】然后,最后解析后面的时间标签再得到【字】对应的时间。是的,解析歌词行的每个【字】,这是在制作歌词的时候,才需要去做的事情啊,所以这里也是需要优化的地方,加上各种歌词间相互转换时,该格式存在出错的概率比较多,往往会因为得到的【字】个数与后面的【字】时间个数不对应,而报错。所以基于以上的种种原因,我重新改良了该歌词的格式:

haplayer.tag[qq:];
[ti:志在千里];
haplayer.tag[total:1230449];
haplayer.tag[by:];
haplayer.tag[sign:];
haplayer.tag[al:];
[ar:茶太];
[offset:0];
haplayer.tag[hash:fa8e1508c06761a9b82631f1cf7c3b54];
haplayer.extra.lrc('eyJjb250ZW50IjpbeyJseXYSI。。。。(此处省略100字)。。。。。。。。。。。sImkiLCJ0ZSJdXX1dfQ==');
haplayer.lrc('<28131,32889>','<赤><く><燃><ゆ><る>','<1302,951,401,250,1854>');

从上面的内容可以看出,该歌词格式也是支持音译歌词和翻译歌词的(参考krc原理)。主要优化在歌词行:

 haplayer.lrc('<28131,32889>','<赤><く><燃><ゆ><る>','<1302,951,401,250,1854>'); 在这里,我将每个【字】用<>来包住,这样子在解析时,除了简单,相对准确性会比较高。

3歌词实体类结构变化

  1. 歌词实体,添加音译歌词和翻译歌词
  2. 原始歌词行实现,添加分割后的歌词行集合
  3. 翻译歌词实体
  4. 翻译歌词行实体,添加分割后的歌词行集合
  5. 音译歌词实体
  6. 音译歌词行实体,和原始歌词行的实体一样

4歌词过长换行显示思路

在上面的歌词实体,新添加分割后的歌词行集合。当歌词内容过长,超出了显示的view时,歌词超出的部分会换行显示。在这里,我不是在显示的时候,才对歌词进行换行处理的,我的思路如下:

  1. 解析歌词文件,得到原始的歌词集合
  2. 根据view的大小,对歌词集合中的原始行歌词,进行分割,得到换行后的歌词集合

5多行原始歌词(包含歌词过长换行)显示思路

关于多行歌词的显示方式,我在显示篇的时候,已经讲解过,原理也是差不多的。这里以android为例子,在文章最后我会贴上我的源码,之前关于view的平滑移动是使用ValueAnimator的动画来实现的,我发觉它在实现fling的效果时,并不是好理想。所以我就转用了scroller来实现view的平滑移动,这里需要注意的是,scroller只做动画,不要使用它来移动view。我实现的思路如下:

  1. 主要是以分割后歌词集合作为绘画当前歌词的数据。
  2. 行的高度= (歌词高度 + 空行高度)* 分割后歌词的行数
  3. 每行歌词与所在view的位置绑定,公式:Y=行号*(歌词高度 + 空行高度)
  4. 动感歌词行居中显示,公式:(view的中间值+(歌词高度 + 空行高度))*0.5 + 移动到当前行号所需的Y值- offsetY
  5. offsetY是从当前歌词行切换到下一行时,需要的偏移值,公式:offsetY= 移动到【新】行号所需的Y值 - 移动到当前行号所需的Y值
  6. 移动到行号所需的Y值 = 第0个到行号的每行高度累加值。
  7. 歌词滑动快进时,在计算滑动所在的行号(需要注意行的高度),可通过offsetY值和每行歌词与view所绑定的位置关系,来计算当前对应的是第几行歌词。
  8. 在绘画歌词的过程中,顺序需要变一下,存在歌词过长换行的情况,所以每行歌词的Y值会有变化。先绘画当前歌词行,计算绘画分割后的当前行所需的Y值后,再使用该Y值来绘画当前歌词行下面的歌词。

实现效果预览:

6多行额外歌词显示思路

原理和多行原始歌词显示差不多,需要注意如下问题:

  1. 音译歌词:音译歌词因为需要知道每个【字】的时间,所以需要在原始歌词的基础上构造音译歌词。
  2. 翻译歌词:如果需要像音译歌词那样显示动感效果,则需要获取歌词的持续时间,计算每个【字】的平均时间,所以也是需要在原始歌词的基础上获取开始时间和结束时间,计算每个【字】的平均时间。
  3. 移动到行号所需的Y值,需要加上额外歌词行的高度
  4. 绘画歌词时,画完当前行分割的歌词后,需要向下画行对应的分割额外歌词。最后再向下画下一行歌词。在画当前行歌词上面的歌词时,先画额外歌词。

实现效果预览:

7源码

由于我的语文水平有限,表达得不清楚,所以,大家如果看不懂或者想更深入了解,可到我的github上面看源码。

7.1乐乐音乐Android版本

该版本已经支持和显示翻译歌词和音译歌词:https://github.com/zhangliangming/HappyPlayer5.git

7.2乐乐音乐Java Swing PC版

该版本支持显示多种语言歌词,并且提供了制作歌词(包含音译和翻译)功能: https://github.com/zhangliangming/HappyPlayer-PC.git

8最后

希望动感歌词的分析篇、生成篇、解析篇、显示篇和补充篇对一些想了解或者想实现动感歌词的读者有帮助。如有侵权,麻烦告知。

9联系方式

316257874@qq.com

Read More

浅谈动感歌词-歌词生成篇

1引言

在写这生成篇时,我还是在烦恼应该是先写歌词解析篇,还是先写歌词生成篇,后来我想一想,其实还是要先有歌词文件,才有解析嘛,当然,我们也可以通过现有的歌词(krc、trc和ksc等)直接跳过这一步,直接解析歌词即可。

Read More

浅谈动感歌词-歌词分析篇

1引言

关于动感歌词,我们都不陌生,最常见的就是去唱K时,MV上面的歌词,还有就是酷狗、天天动听和QQ音乐等播放器的歌词,它们都是属于动态歌词,它们都是精确到每个【字】,这大大提高了用户的体验。如果一个菜鸟想自己实现动感歌词该怎么办?是的,下面我将从我自己的一些自身经历来谈一下,怎样实现动态歌词.

Read More