jneyxwry
发表于 2010-4-8 00:20:28
是版本问题。我现在换最新的就可以了。我就是想问一下。C.L大哥。你现在把歌词放在程序中,那能不能外部读取啊?
C.L
发表于 2010-4-8 00:25:46
回复 31# jneyxwry
可以啊,要放在外部的话,参考afan的例子,改一改就可以了
jneyxwry
发表于 2010-4-8 00:29:12
afan哥的运行了没有一行一行的提示
jneyxwry
发表于 2010-4-8 00:29:58
C.L 可以给 au3写一下注释吗?我看不懂哦。其实我不用这么复杂的。我只要可以按时间输入我指定的窗口里去就可以了。
afan
发表于 2010-4-8 00:31:18
回复 33# jneyxwry
代码中有注释啊,注释上行+取消注释下行。
C.L
发表于 2010-4-8 00:33:59
本帖最后由 C.L 于 2010-4-8 00:49 编辑
回复 34# jneyxwry
写注释哦....我晕,最怕写这个...我文字表达能力不行的.
先给你一个读外部lrc文件的代码,文件名和读取是从afan那代码拿过来的(^_^):
顺便改下,把注释加上
#include <GUIConstantsEx.au3>
Local $lrc = '连贝多芬都想告诉你.lrc'
Local $str = FileRead($lrc)
Opt("GUIOnEventMode", 1);开启事件模式
MsgBox (0,"原始Lrc文件",$str)
$Form = GUICreate("Test", 413, 566, @DesktopWidth / 2 - 150, @DesktopHeight / 2 - 320)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$Edit = GUICtrlCreateEdit("", 1, 8, 408, 550)
GUICtrlSetData(-1, "")
GUISetState();以上是建立GUI
$aStr = StringRegExp($str, "(\[.*\])([^\]]+)\r", 3);将从文件读出来的内容分开存入数组.
$out = ""
$t = TimerInit();初始化时间
While 1
For $i = 0 To UBound($aStr) - 1;循环读取数组
$time = StringRegExp($aStr[$i], "\[(.*?)\.", 3);逐条将数组内的时间提取到数组$time中
If IsArray($time) Then
For $j = 0 To UBound($time) - 1;如果数组内时间读取成功,循环检查时间
$tmptime = StringSplit($time[$j], ":")
$tagtime = $tmptime * 60 + $tmptime;将时间分成分钟和秒,并转换成秒数.
If Round(TimerDiff($t) / 1000, 2) == Round($tagtime / 5, 2) Then ;如果和当前运行的时间一致,(这里我进行了调速,如果要按正常时间输出,将Round($tagtime / 5,2)改成Round($tagtime,2)即可
$out &= $tmptime & ":" & $tmptime & @TAB & $aStr[$i + 1] & @CRLF
GUICtrlSetData($Edit, $out);在窗口逐条输出歌词
Sleep(200)
If $tagtime == "329" Then
Sleep (3000)
GUICtrlSetData($Edit, $out & @CRLF & @TAB & "**********end**********");输出结束标志
ExitLoop
EndIf
EndIf
Next
EndIf
Next
WEnd
Func _exit()
Exit
EndFunc ;==>_exit
jneyxwry
发表于 2010-4-8 00:35:46
好像afan哥 写的没有按时间来
afan
发表于 2010-4-8 00:37:03
回复 37# jneyxwry
是按时间顺序来,并没有指定时间输出…… 还是不看注释
jneyxwry
发表于 2010-4-8 00:39:16
For $i = 0 To UBound($sR) - 1
$_time = StringRegExpReplace($sR[$i], '(\[|\])', '\\$1')
$txt &= StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1') & @CRLF
;以上是做整体输出演示用,如需输出单行,下行即可。如需同步时间,也只需加上匹配经过时间=$sR[$i]
MsgBox(0, 0, StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1'))
Next
这个循环中怎么来加 $sR[$i] 时间呢?
jneyxwry
发表于 2010-4-8 00:53:26
#include <Array.au3>
$ti = "设置"
Local $lrc = '连贝多芬都想告诉你.lrc'
Local $str = FileRead($lrc)
Local $sR = StringRegExp($str, '\[\d\d:\d\d.\d\d\]', 3)
_ArraySort($sR)
Local $txt = '', $i, $_time
For $i = 0 To UBound($sR) - 1
$_time = StringRegExpReplace($sR[$i], '(\[|\])', '\\$1')
$txt &= StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1') & @CRLF
;以上是做整体输出演示用,如需输出单行,下行即可。如需同步时间,也只需加上匹配经过时间=$sR[$i]
;MsgBox(0, 0, StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1'))
$a = WinExists($ti)
msgbox(0,0,$sR[$i])
sleep($sR[$i])
If $a = 1 Then
ControlSetText ($ti, "", 'Edit2', StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1') )
Else
MsgBox(0,'提示','指定窗口“'&$ti&'”不存在,请检查!')
EndIf
Next感觉还是没有按时间来显示啊
afan
发表于 2010-4-8 01:52:05
本帖最后由 afan 于 2010-4-8 02:10 编辑
回复 40# jneyxwry
你那个当然不行~
修改了下,加入了同步代码。演示出现在屏幕的左上角。按Esc键可即时终止。
;#include <Array.au3>
#include <Misc.au3>
Local $lrc = '连贝多芬都想告诉你.lrc'
Local $str = FileRead($lrc)
Local $sR = StringRegExp($str, '\[\d\d:\d\d\.\d\d\]', 3)
_ArraySort($sR)
Local $txt, $i, $_time
$begin = TimerInit()
For $i = 0 To UBound($sR) - 1
$_time = StringRegExpReplace($sR[$i], '(\[|\])', '\\$1')
$txt = StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1')
While 1
Sleep(10)
If _IsPressed('1B') Then ExitLoop 2
If Round(TimerDiff($begin)) >= Execute(StringRegExpReplace($sR[$i], '\[(\d\d):(\d\d)\.(\d\d)\]', '$1*60*1000+$2*1000+$3*10')) Then
ToolTip($txt, 0, 0) ;这里的$txt即需要的文本变量,输出只需改动此行。
ExitLoop
EndIf
WEnd
Next;
开着Winamp测试了下,有点感觉~
jneyxwry
发表于 2010-4-8 01:55:07
嗯。谢谢两位高手。已经模清楚了。
lxz
发表于 2010-4-8 07:56:07
我这里也正常
yangfengoo
发表于 2010-4-8 09:43:51
路过学习:face (29):
jneyxwry
发表于 2010-4-8 16:40:36
请问可以在播放的时候加入热键 快进跟快退吗?
因为考虑到音乐比歌词早,或是歌词比音乐早。不能同步的原因。就一整首页要快完,或是慢完。
有没有办法在这个中间置热键+或是- 来控制 字幕时间的快慢啊??