2017-10-06 302 views
5

閱讀所有以前的答案,並沒有運氣。 在我需要使用文本同步mp3音頻的Android應用中工作。隨着mp3播放,它不斷改變文字。就像YouTube上的歌詞亮點等如何將mp3音頻與文本同步?

回答

1

他們使用LRC文件生成的mp3下歌詞

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

從本質上講,(或其他)標記有時間的歌詞,他們應該出現,如果您使用的android播放器支持LRC,應該按照正確的時間間隔自動疊加歌詞,甚至可以使用擴展標籤一次顯示幾行字詞。

2

首先你需要創建一個你要玩,然後在你的媒體播放器添加字幕文件作爲

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

創建字幕文件,你可以使用檢查此網址 Create Subtitle音頻的字幕文件。

+0

如何顯示textview上的字幕? – Husnain

+0

是的,你可以在textview上顯示字幕請點擊此鏈接:https://stackoverflow.com/questions/13422673/looking-for-a-working-example-of-addtimedtextsource-for-adding-subtitle-to-a-vid – Ashish

0

我沒有任何Android的代碼示例,但我做了這樣的Javascript,所以我要指出你的一些步驟。看看這個LRC Maker & Generator,它包含了一個樣本「我的心將繼續」與歌詞同步。如果這是你想達到那麼好。

1- Think 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彭達皮雅-Naku塔卡皮雅-Mpenziwe,...)
  • 的ArrayList解析標籤([00.12.00] [00.18.50],...)
  • ArrayList的解析文本行(Naku彭達皮雅-Naku塔卡皮雅-Mpenziwe,...)
  • 的ListView對左,歌詞線右側
  • 顯示時間格式
  • 顯示在您的ListView中的行數
  • 列表項保存Views (時間格式TextView,歌詞行TexView或EditText,如果您允許用戶添加或編輯應用程序中的每一行歌詞)

3-代碼引擎。您需要使用正則表達式來提取每行([00.12.00])中的格式化行([00:12.00] Naku Penda Piya-Naku Taka Piya-Mpenziwe)和時間標籤。您可以使用它們從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並將它們放入屬性標記和行中「LRC項目」類,您將用於在ListView中填充信息。

LRC的物品類別應具備的屬性:

  • 時間啓動變量
  • 時間結束標記
  • 串線

對於每一行,結束標籤將是一樣的啓動變量下一行。將事件監聽器添加到音樂播放器播放當前時間。每次獲得當前時間時,迭代所有LRC項目,檢查id當前時間介於LRC開始時間和結束時間之間,然後更改Line EditText的顏色以突出顯示此行。

3b-下一步您最想要的部分,用於同步,將事件偵聽器添加到LRC項目佈局的「時間標籤」TextView和「線路」EditText中。每次用戶點擊時間標籤TextView時,都要更新LRC時間標籤值並在時間標籤TextView中以[XX:YY.ZZ]格式寫入新時間。

當用戶點擊一行EditText或TextView,然後將音樂播放器更改爲當前時間,這將允許用戶返回任何行以更正下一行的時間標記。最後,完成後,迭代並獲取每個LRC Item類的新信息,並將每個Line(Naku Penda Piya-Naku Taka Piya-Mpenziwe)旁邊的每個Time Tag([00:12.00])和在每行後添加新行「\ n」。您可以決定是否將它寫入music-file.lrc或將其保存到數據庫中。

您可以在JS File上查看更多信息。感謝Lusaisai Lyricer Package Live Demo,這激勵了我。