全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1903
推到 Plurk!
推到 Facebook!

有關音樂檔

尚未結案
n890377
一般會員


發表:17
回覆:16
積分:21
註冊:2006-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-18 17:14:55 IP:163.22.xxx.xxx 訂閱
請教各位大大:
我想在一段音樂的某一段時候加入我想做的事....
譬如:一段音樂有10秒...我要在音樂第5秒出現的時候,同時在我的bcb介面上出現一行字
請叫各位大大有沒相關範例程式或方法可以幫助我?
謝謝!!!!
------
.
編輯記錄
taishyang 重新編輯於 2007-07-06 15:02:41, 註解 將文章分類成[問題]‧
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-18 17:34:40 IP:125.229.xxx.xxx 訂閱
你想做字幕的功能吧?
現在不知你會不會播放音樂檔了,如果會,那可以直接跳到字幕的問題...
用LRC檔吧?.
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
n890377
一般會員


發表:17
回覆:16
積分:21
註冊:2006-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-19 14:17:53 IP:163.22.xxx.xxx 訂閱
我現在知道怎麼播放音樂檔了.....
現在重點是在我要在某一秒的時候....Label或Edit的元件上面可以出現文字....
不知道怎麼下手???

大大所說的LRC是指什麼呢?
------
.
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-19 17:05:35 IP:125.229.xxx.xxx 訂閱
LRC是目前很流行的MP3字幕檔,一般MP3隨身聽、WINAMP播放器.......有帶字幕功能的都是用這種方法,結構很簡單...

[offset:1000]
[00:00.00]優客李林 << 認錯 >>
[00:14.00]詞\曲:李驥
[00:15.00]
[00:16.00]I don't beloeve it
[00:18.00]是我放棄了你
[00:23.00]只為一個沒有理由的決定
[00:31.00]以為這次我可以
[00:34.00]承受你離我而去
[00:39.00]不必讓你傷心
[00:42.00]卻刺痛自己
[03:02.00][00:47.00]一個人走在傍晚七點的台北City
[03:11.00][00:56.00]等著心痛就像黑夜一樣的來臨
[03:20.00][01:04.00]I hate myself
[03:23.00][01:07.00]又整夜追逐夢中的你
[03:27.00][01:12.00]而明天只剩哭泣的心
[04:09.00][03:38.00][01:22.00]怎麼才能讓我告訴你我不願意
[04:18.00][03:46.00][02:00.00][01:30.00]教彼此都在孤獨裡忍住傷心
[04:26.00][03:55.00][02:08.00][01:38.00]我又怎麼告訴你我還愛你
[04:44.00][04:35.00][04:03.00][02:17.00][01:46.00]是我自己錯誤的決定
[01:53.00]我要告訴你斥我不願意
[02:26.00]( MUSIC )

由時間標記跟歌詞所組成,時間標記是[ 分 : 秒 : 毫秒 ]的格式(已經很細了)..........有些句子是連續幾個時間標記,那就是表示這句被重覆唱了好幾次,為了節省空間,就把幾個標記疊加起來放....只要播放器的程式別寫的太差,這不是問題

OK,先不考慮你的播放器會不會FORWARD跟BACK..(跳帶),一首歌就從頭播到尾.........
你要準備一個TIMER,解析度要到0.01秒觸發一次(INTERVAL設10),不然歌詞會有點軋不上人的歌聲.....

再準備一個有一首歌總秒數 乘上 100 的字串陣列( 不太吃記憶体,放心 ),比如一首5分鐘的MP3,你就需要準備5*60秒 *100 = 30000
var LRC : array[0..30000] of string ;
用動態長度陣列吧..如果你能掌握動態陣列

接下來就是一句一句解析這個歌詞檔......delphi沒有正則表達式函數可用,殘念......
所以只能用pos判斷是不是有時間標記( 時間標記前後都是中括號 )...
如果有,把時間標記取出來,換成時間總長.[03:05:00]就是 (3*60 5 0)*100 = 18500
把這句詞放進陣列的第18500號元素中.......... LRC[18500] := '詞XXXXXXXXXXX' ;

一句一句把標記處理掉,大概花個0.001秒就完成了

然後開始播放MP3或其他音樂檔(其實MTV的檔也可以,但MTV大多都有焊死的字幕....不用自己寫)
TIMER去計算目前歌放到第幾毫秒,然後在相應的時間到的時候把歌詞顯示出來....

大致上就是如此,有個更省記憶体的方法來存放時間跟詞,不過技巧多了點,容後再述.
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
n890377
一般會員


發表:17
回覆:16
積分:21
註冊:2006-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-22 12:03:01 IP:163.22.xxx.xxx 訂閱
大大我已經解決了但是不是用LRC....
還是謝謝大大的指導.......
程式某段:
case Sec:
Label4->Caption=(Now()-start).FormatString("hh:nn:ss");
if (Label4->Caption==(Now()-start).FormatString("00:00:02") )
{
Form1->Edit1->Text="2";
}
break;

------
.
hippo04
一般會員


發表:5
回覆:10
積分:3
註冊:2002-10-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-06 14:54:30 IP:59.120.xxx.xxx 訂閱

哈囉~~~japhen大大
最近對這個有興趣~而且也有完成一些
想請問大大 你說更省記憶體的方法來存放"時間"跟"歌詞"
不知道是怎樣的想法
可不可以麻煩你說明一下阿~~
編輯記錄
hippo04 重新編輯於 2007-07-06 14:55:20, 註解 無‧
系統時間:2024-05-02 9:10:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!