如何将mp3音频与文本同步?

5

阅读了之前的所有答案,但没有得到帮助。 我正在开发一款安卓应用程序,需要将mp3音频与文本同步。当mp3播放时,文本会不断改变。就像YouTube上的歌词突出显示等。

3个回答

3

首先,您需要创建所需播放的音频的字幕文件,然后将该字幕文件添加到媒体播放器中。

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();
        }

要创建字幕文件,您可以使用以下网址:创建字幕


是的,您可以按照此链接在TextView上显示字幕:https://dev59.com/1GYr5IYBdhLWcg3wvsvR - Ashish

1
他们使用LRC文件来在mp3下生成歌词。

https://en.wikipedia.org/wiki/LRC_(file_format)

基本上,歌词(或其他内容)都标记了它们应该出现的时间,如果你使用的安卓播放器支持LRC,它应该会在正确的时间间隔自动叠加歌词,你甚至可以使用扩展标记让每行歌词逐字逐句地出现。

0

我没有安卓的代码样本,但我用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或您的自定义库)来处理信息和对象以读取、显示和写入简单格式。您的类应具有以下属性:

  • 原始文本行的ArrayList([00:12.00]Naku Penda Piya-Naku Taka Piya-Mpenziwe,...)
  • 解析标签的ArrayList([00.12.00],[00.18.50],...)
  • 解析文本行的ArrayList(Naku Penda Piya-Naku Taka Piya-Mpenziwe,...)
  • ListView,在左侧显示时间格式,在右侧显示歌词行
  • 要在您的ListView中显示的行数
  • 列表项,其中包含视图,如(时间格式TextView,歌词行TexView或EditText,如果允许用户在应用程序中添加或编辑每行歌词)

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 给我带来的灵感。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接