找回密码
 加入
搜索
楼主: jneyxwry

[AU3基础] 读LRC歌词中的歌词作为变量逐步输出

 火... [复制链接]
 楼主| 发表于 2010-4-8 00:20:28 | 显示全部楼层
是版本问题。我现在换最新的就可以了。我就是想问一下。C.L大哥。你现在把歌词放在程序中,那能不能外部读取啊?
发表于 2010-4-8 00:25:46 | 显示全部楼层
回复 31# jneyxwry

可以啊,要放在外部的话,参考afan的例子,改一改就可以了
 楼主| 发表于 2010-4-8 00:29:12 | 显示全部楼层
afan哥的运行了没有一行一行的提示
 楼主| 发表于 2010-4-8 00:29:58 | 显示全部楼层
C.L 可以给 au3写一下注释吗?我看不懂哦。其实我不用这么复杂的。我只要可以按时间输入我指定的窗口里去就可以了。
发表于 2010-4-8 00:31:18 | 显示全部楼层
回复 33# jneyxwry


代码中有注释啊,注释上行+取消注释下行。
发表于 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[1] * 60 + $tmptime[2];将时间分成分钟和秒,并转换成秒数.
                                If Round(TimerDiff($t) / 1000, 2) == Round($tagtime / 5, 2) Then ;如果和当前运行的时间一致,(这里我进行了调速,如果要按正常时间输出,将Round($tagtime / 5,2)改成Round($tagtime,2)即可
                                        $out &= $tmptime[1] & ":" & $tmptime[2] & @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

评分

参与人数 1金钱 +10 收起 理由
afan + 10

查看全部评分

 楼主| 发表于 2010-4-8 00:35:46 | 显示全部楼层
好像  afan哥 写的没有按时间来
发表于 2010-4-8 00:37:03 | 显示全部楼层
回复 37# 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] 时间呢?
 楼主| 发表于 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
感觉还是没有按时间来显示啊
发表于 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测试了下,有点感觉~
 楼主| 发表于 2010-4-8 01:55:07 | 显示全部楼层
嗯。谢谢两位高手。已经模清楚了。
发表于 2010-4-8 07:56:07 | 显示全部楼层
我这里也正常

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-4-8 09:43:51 | 显示全部楼层
路过学习
 楼主| 发表于 2010-4-8 16:40:36 | 显示全部楼层
请问可以在播放的时候加入热键 快进跟快退吗?

因为考虑到音乐比歌词早,或是歌词比音乐早。不能同步的原因。就一整首页要快完,或是慢完。

有没有办法在这个中间置热键  +  或是  - 来控制 字幕时间的快慢啊??
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-19 05:36 , Processed in 0.125887 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表