阅读了之前的所有答案,但没有得到帮助。
我正在开发一款安卓应用程序,需要将mp3
音频与文本同步。当mp3
播放时,文本会不断改变。就像YouTube上的歌词突出显示等。
首先,您需要创建所需播放的音频的字幕文件,然后将该字幕文件添加到媒体播放器中。
String mimeType = getMimeType("file://mnt/sdcard/BarbieGirl.srt");
// mp.selectTrack(index);
try {
mp.addTimedTextSource(path, mimeType);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
要创建字幕文件,您可以使用以下网址:创建字幕。
我没有安卓的代码样本,但我用JavaScript做了类似的东西,所以我会指出一些步骤。看看这个LRC Maker & Generator,它包含了一个带有歌词同步的"My Heart Will Go On"示例。如果这是你想要实现的,那就很好。
1- 考虑LRC,这是一种文本格式,用于处理音频文件的同步。每行在括号内包含有关音频或时间的信息,例如:
[ar:Chubby Checker oppure Beatles, The]
[al:Hits Of The 60's - Vol. 2 – Oldies]
[ti:Let's Twist Again]
[au:Written by Kal Mann / Dave Appell, 1961]
[length: 2:23]
[00:12.00]Naku Penda Piya-Naku Taka Piya-Mpenziwe
[00:15.30]Some more lyrics ...
请查看维基百科LRC格式,其中包括简单格式(逐行)和高级格式(逐字)。我建议从简单格式开始。
2- 创建Java类(Activity或您的自定义库)来处理信息和对象以读取、显示和写入简单格式。您的类应具有以下属性:
3- 编写引擎。您需要使用正则表达式来提取格式化的行([00:12.00]Naku Penda Piya-Naku Taka Piya-Mpenziwe)和每行中的时间标签([00.12.00])。您可以从JavaScript代码示例中使用它们:
var tagRegex = /\[([a-z]+):(.*)\].*/;
var lrcAllRegex = /(\[[0-9.:\[\]]*\])+(.*)/;
var timeRegex = /\[([0-9]+):([0-9.]+)\]/;
var rawLrcArray = rawLrc.split(/[\r\n]/);
tagRegex 用于选择音乐信息(标题、艺术家、流派等)
lrcAllRegex 用于选择具有 LRC 格式的行。
timeRegex 用于选择具有 LRC 格式的完整行中的时间格式
rwaLrcArray 用于将整个文本拆分为行数组。在 Java 中,这不应该很难。
3a- 因此,使用 Android 中 ArrayAdapter 的基本过程通过添加多个项目来读取文本,将其分成多行数组,解析时间标签,解析行并将它们放入属性标记和行到“LRC 项”类中,您将使用该类来填充 ListView 中的信息。
LRC 项类应具有以下属性:
对于每一行,结束标签将与下一行的开始标签相同。将事件侦听器添加到您的音乐播放器以播放当前时间。每次获取当前时间时,迭代所有 LRC 项,检查当前时间是否在 LRC 开始时间和结束时间之间,然后更改 Line EditText 的颜色以突出显示此行。
3b- 接下来是你最想要的部分,为了同步,在 LRC 项目布局中的“时间标签” TextView 和“行” EditText 上添加事件监听器。每当用户点击一个时间标签 TextView 时,更新 LRC 时间标签值,并将新时间以 [XX:YY.ZZ] 格式写入时间标签 TextView。
当用户点击一行 EditText 或 TextView 时,将音乐播放器更改为当前时间,这将允许用户返回到任何一行以更正下一行的时间标签。
4- 最后,完成后,迭代并抓取每个 LRC 项目类上的新信息,并将每个时间标签 ([00:12.00]) 连接到每个行(Naku Penda Piya-Naku Taka Piya-Mpenziwe)旁边,并在每行后添加新行“\n”。你可以决定是将其写入 music-file.lrc 还是仅保存到数据库中。
你可以在 JS 文件 中查看更多内容。感谢 Lusaisai Lyricer Package Live Demo 给我带来的灵感。