【问题标题】:How to synchronize mp3 audio with text?如何将 mp3 音频与文本同步?
【发布时间】:2017-10-06 04:59:23
【问题描述】:

阅读所有以前的答案,但没有运气。 在我需要将mp3 音频与文本同步的android 应用程序上工作。随着mp3 的播放,它不断地改变文本。就像 YouTube 上的歌词集锦等。

【问题讨论】:

    标签: java android mp3


    【解决方案1】:

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

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

    为了创建字幕文件,你可以使用检查这个 url Create Subtitle.

    【讨论】:

    【解决方案2】:

    他们使用LRC文件来生成mp3下的歌词

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

    基本上,歌词(或其他)都标有它们应该出现的时间,如果您使用的 android 播放器支持 LRC,它应该在正确的时间间隔自动覆盖歌词,您甚至可以制作带有扩展标记的行一次出现几个单词。

    【讨论】:

      【解决方案3】:

      我没有任何适用于 android 的代码示例,但我使用 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 ...
      

      检查Wikipedia LRC Format,有简单格式(逐行)和高级格式(逐字)。我建议从简单格式开始。

      2- 创建 Java 类(活动或您的自定义库)来处理信息和对象以读取、显示和写入简单格式。你的类应该有属性:

      • 原始文本行的 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在ListView中添加多个项目的基本流程,读取Text,将其划分为多行数组,解析Time Tags,解析Lines并将它们放入attributes tag和line到“ LRC item" 用于在 ListView 中填充信息的类。

      LRC 项目类应该有属性:

      • 时间开始标签
      • 时间结束标签
      • 字符串线

      对于每一行,结束标记将与下一行的开始标记相同。将事件监听器添加到您的音乐播放器播放当前时间。每次获取当前时间,迭代所有 LRC 项目,检查 id 当前时间在 LRC 开始时间和结束时间之间,然后更改 Line EditText 的颜色以突出显示该行。

      3b- Next 您最想要的部分,用于同步,将事件侦听器添加到“时间标签”TextView 和 LRC 项目布局的“行”EditText。每次用户单击时间标签 TextView 时,更新 LRC 时间标签值并将新​​时间以 [XX:YY.ZZ] 格式写入时间标签 TextView。

      当用户点击 Line EditText 或 TextView,然后将音乐播放器更改为当前时间,这将允许用户返回任何 Line 以更正 Next Line 的时间标记。

      4- 最后,完成后,迭代并获取每个 LRC 项目类的新信息,并连接每行旁边的每个时间标签 ([00:12.00]) (Naku Penda Piya-Naku Taka Piya-Mpenziwe) 并添加每行之后的新行“\n”。由您决定是将其写入 music-file.lrc 还是仅将其保存到数据库中。

      您可以在JS File 上查看更多信息。感谢Lusaisai Lyricer Package Live Demo,这启发了我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        相关资源
        最近更新 更多