廣論/字幕對應表

在播放音檔時,論文區域能夠跟著字幕的時間標記出目前所講的位置,完全是依賴廣論/字幕對應表所描述的內容來完成。廣論/字幕對應表的檔案是BookMap.java,其中mapStr這個字串陣列總共有320個字串,對應到320個音檔內容,字串內的元素是分號(;)來分隔每一筆記錄,每一筆記錄又以6個數字所組成,每一個數字所代表的意義如下所表示:

音檔序號, 字幕的序號, 頁數, 行數, 字數, 長度

  • 音檔序號:0 ~ 319, 對應到320個音檔。
  • 字幕序號:0 ~ n, 對應到該音檔的字幕序號。
  • 頁數位置,行數,字數: 定位到要反白標記的位置。
  • 長度:要反白的字串長度。

每一筆記錄中要對應音檔的播放時間與廣論的位置,簡而言之,前面兩個數字是對應到音檔的時間,後面四個數字是對應到廣論的內容。廣論App會每隔一段時間檢查目前播放的時間並找出該對應的字幕序號,再把字幕內容顯示在字幕區(請參閱字幕檔案規則),為了減少計算量,第二個參數所對應到的是字幕的序號,也就是說當前面的計算找到字幕的序號時,同時也找到了論文該反白的位置。

建構該資料結構的程式如下(擷取自LamrimReaderActivity.java):


bookMap = new int[se.length][];
for (int i = 0; i < mediaBookMaps.length; i++) {
	int index = mediaBookMaps[i][1];
	if (index >= se.length) {
		bookMap[index] = new int[4];
		bookMap[index][0] = mediaBookMaps[i][BookMap.PAGE];
		bookMap[index][1] = mediaBookMaps[i][BookMap.LINE];
		bookMap[index][2] = mediaBookMaps[i][BookMap.WORD];
		bookMap[index][3] = mediaBookMaps[i][BookMap.LENGTH];
	}
}
	
for (int i = 1; i < bookMap.length; i++) 
	if (bookMap[i] == null) 
		bookMap[i]=bookMap[i-1];


bookMap是存放上述的對應表的陣列,為了讓程式可以快速的對應找到要反白的位置,將bookMap建構成與字幕陣列一樣長度(se.length),先在對應表中填入每一筆記錄(第一個for迴圈),接著再將中間未填資料的部份填入該位置之前的最後一筆記錄,依序填滿以後就完成我們所需要的資料結構,執行時便可以照著前面的描述快速的找到對應的資料。


Comments