发新帖  新投票  回帖 
wu2011

回复时间:2013-8-22 15:45

原帖由 枳橘吟 于 2013-8-20 23:08 发表
  给 梦回君 几点建议。
  花了不少时间,琢磨梦回君的佳作。褒奖的话就不说了。建议是否正确、合理,烦 梦回君 查核。

  1、“第二部分:解析LRC文件的功能”,在 “ var lrcLine:Array = lrcStr.split("\n");” 之后,增加一个处理:
    “删除空白行”为好,防止含空行的情况。我的歌词文件,常为方便校对,空了行,完成后没有删除空行。网上下载lrc文件偶尔也会遇到。

  2、“第二部分:解析LRC文件的功能”,得到的是“单时间标签”的歌词行,“lrcItem”数组。
    在这一部分,再进一步,将“lrcItem”数组处理为“时间数组”和“歌词数组”,在后面的同步调用时就是直接的,不需要再作于下表达的处理。
    “lrcItem[curLrcId+1].slice(0,7)”;

  3、时间值不必判断7位、5位,因为一般标准的lrc文件,时间值表示为:[02:30.54],读出后换算成 151 (秒)或 1505 (0.1秒)
    这样处理后,解析才算是“彻底”完成,最后得到于下两个数组。明了,用起来也直接、方便。
    lrctime = [5, 10, 15, 30];
    lrctext = ["我们", "都是", "好朋友", ""];
    当然,这两个数组的内容是“看不见”的。

  4、wu2011君 提到的最后一句没有盖字效果的问题,在时间数组的最后增加一个时间值(如:比歌曲总时长少1秒左右),歌词为空即可。
    这样,数组统一了,也不必再设置判断或“特殊处理”。

  5、“第三部分:显示LRC歌词的功能”中,函数“getTimeMS”,第三项为重复计算,“timeStr”中的“小数”在第二项已参与计算过了。

  专此。

[本帖最后由 枳橘吟 于 2013-8-21 18:12 编辑]


总的来讲,程度根据个人的强项、习惯、写法去写就最好,因为各人的理念不同,枳先生写这几点很到位,一直我也是用两个数组的,说心里话,梦回这个写法很有个性,当第一次看到时,高效、简洁的拆分字符令人佩服,但到后期使用时就看到不足。
梦回也曾说过,我那个分析很复杂,的确是有的复杂,其实也可以写简单一点,除了个开头需多几个判断之外,下面的也可以几句完成的。

function decode(value:String):Array
{


var data:Array = [];
var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
var reg_timeChild:RegExp = /\[(\d\d):(\d\d\.\d\d)\]/g;

var search:Array = value.match(reg_search);

for each (var info:String in search) {

var times:Array = info.match(reg_time);
//去除歌词,获得时间

var lrc:String = info.replace(reg_time,"");
//去除时间,获得歌词


for (var i:int = 0; i < times.length; i++) {

var time_info:String = times[i];
var m:String = time_info.replace(reg_timeChild,"$1");
var s:String = time_info.replace(reg_timeChild,"$2");
var time:Number = (Number(m) * 60 + Number(s))*1000;
data.push({time:time , lrc:lrc });

}

}

return data;

}

返回是一个Aray,调用Array[index].time和Array[index].lrc

第一个正则用于采集 var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
.代表任何一个字符但除了换行符"\n",*代表重复一次或多次,所以将全部字符搜寻并很巧妙地去除了换行符

第二个正则用于匹配时间 var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
[00:02.00]
[00:06.23]
大家都有共同点
/(\[\d\d:\d\d\.\d\d\])/g; 一下子就将全搜索出来


第三个正则/\[(\d\d):(\d\d\.\d\d)\]/g;
将时间分成两个子使用,就会被的$1或$2来引用,所以能巧妙地去掉了[]号

 
梦回轻狂

回复时间:2013-8-22 17:06

原帖由 wu2011 于 2013-8-22 15:45 发表

原帖由 枳橘吟 于 2013-8-20 23:08 发表
  给 梦回君 几点建议。
  花了不少时间,琢磨梦回君的佳作。褒奖的话就不说了。建议是否正确、合理,烦 梦回君 查核。

[本帖最后由 枳橘吟 于 2013-8-21 18:12 编辑]


总的来讲,程度根据个人的强项、习惯、写法去写就最好,因为各人的理念不同,枳先生写这几点很到位,一直我也是用两个数组的,说心里话,梦回这个写法很有个性,当第一次看到时,高效、简洁的拆分字符令人佩服,但到后期使用时就看到不足。
梦回也曾说过,我那个分析很复杂,的确是有的复杂,其实也可以写简单一点,除了个开头需多几个判断之外,下面的也可以几句完成的。

function decode(value:String):Array
{


var data:Array = [];
var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
var reg_timeChild:RegExp = /\[(\d\d):(\d\d\.\d\d)\]/g;

var search:Array = value.match(reg_search);

for each (var info:String in search) {

var times:Array = info.match(reg_time);
//去除歌词,获得时间

var lrc:String = info.replace(reg_time,"");
//去除时间,获得歌词


for (var i:int = 0; i < times.length; i++) {

var time_info:String = times[i];
var m:String = time_info.replace(reg_timeChild,"$1");
var s:String = time_info.replace(reg_timeChild,"$2");
var time:Number = (Number(m) * 60 + Number(s))*1000;
data.push({time:time , lrc:lrc });

}

}

return data;

}

返回是一个Aray,调用Array[index].time和Array[index].lrc

第一个正则用于采集 var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
.代表任何一个字符但除了换行符"\n",*代表重复一次或多次,所以将全部字符搜寻并很巧妙地去除了换行符

第二个正则用于匹配时间 var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
[00:02.00]
[00:06.23]
大家都有共同点
/(\[\d\d:\d\d\.\d\d\])/g; 一下子就将全搜索出来


第三个正则/\[(\d\d):(\d\d\.\d\d)\]/g;
将时间分成两个子使用,就会被的$1或$2来引用,所以能巧妙地去掉了[]号



正则表达式概念上简单,但真正运用起来难度想必是比较大的,
写得好与不好,看的是一个人认知事物规律、分析具体问题的能力和组织算法的能力。


前几天在网上收集到一个AS3的歌词同步MP3播放器基础模型,
是文档类的格式,全部代码仅仅只有66行。其中LRC解析就一句正则,相关代码二十几行。

我加了一行“lrc_txt.autoSize="center";”,做了个实例,帖出全部代码,供大家参考:










package {
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.Event;
import flash.text.TextField;
import flash.system.System;
public class LRCMp3Player extends Sprite {
var lrc_txt:TextField=new TextField();
var LRCarray:Array=new Array();
var sc:SoundChannel;
public function LRCMp3Player() {
System.useCodePage=true;
lrc_txt.width=500;
lrc_txt.autoSize="center";
addChild(lrc_txt);
var loader:URLLoader=new URLLoader();
loader.load(new URLRequest("http://dreamdesign.105.idcxin.com/bbs/menber/yypz/mp3/lrc/sydjj.txt"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
var sound:Sound=new Sound();
sound.load(new URLRequest("http://dreamdesign.105.idcxin.com/bbs/./menber/yypz/mp3/朗诵吟咏/四月的纪念-独语VS秒龄音.tif"));
sc=sound.play();
stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
}
function SoundPlaying(evt:Event):void {
for (var i=1; i<LRCarray.length; i++) {
if (sc.position<LRCarray[i].timer) {
lrc_txt.text=LRCarray[i-1].lyric;
break;
}
lrc_txt.text=LRCarray[LRCarray.length-1].lyric;
}
}
function LoadFinish(evt:Event):void {
var list:String=evt.target.data;
var listarray:Array=list.split("\n");
var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;
for (var i=0; i<listarray.length; i++) {
var info:String=listarray[i];
var len:int=info.match(reg).length;
var timeAry:Array=info.match(reg);
var lyric:String=info.substr(len*10);
for (var k:int=0; k<timeAry.length; k++) {
var obj:Object=new Object();
var ctime:String=timeAry[k];
var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
obj.timer=ntime*1000;
obj.lyric=lyric;
LRCarray.push(obj);
}
}
LRCarray.sort(compare);
}
private function compare(paraA:Object,paraB:Object):int {
if (paraA.timer>paraB.timer) {
return 1;
}
if (paraA.timer<paraB.timer) {
return -1;
}
return 0;
}
}
}





----------------------------------------------

  能跑的不如能吃的,能吃的不如能睡的;睡觉是头等大事,吃饭是二等大事,运动是三等大事,其余的都是小事。


  中医认为药物和食物是同源的,自古就秉持“寓医于食”的防病治病理念。《黄帝内经》云:“大毒治病十去其六;常毒治病十去其七,小毒治病十去其八,无毒治病十去其九”,“先进厨房,后进药房”的说法在民间更是广为流传。

  食园有路心作引,厨海无涯汗推舟……

 
枳橘吟

回复时间:2013-8-22 19:06
  享受二位的精彩;收藏二位的资料。

  对于F制作,许多东西我是动不得手的。不过也不要紧,欣赏别人的思路、智慧的火花也是享受、启迪。
  “竹疏烟补密,梅瘦雪添肥。”我不会作诗,但这两句却入骨,其他的却记不住。虽区区十字,却“画”出了生动的景象,“补”“添”二字奇巧致极,妙不可言。

  问二位好。

 
wu2011

回复时间:2013-8-23 01:49

原帖由 梦回轻狂 于 2013-8-22 17:06 发表

原帖由 wu2011 于 2013-8-22 15:45 发表

原帖由 枳橘吟 于 2013-8-20 23:08 发表
  给 梦回君 几点建议。
  花了不少时间,琢磨梦回君的佳作。褒奖的话就不说了。建议是否正确、合理,烦 梦回君 查核。

[本帖最后由 枳橘吟 于 2013-8-21 18:12 编辑]


总的来讲,程度根据个人的强项、习惯、写法去写就最好,因为各人的理念不同,枳先生写这几点很到位,一直我也是用两个数组的,说心里话,梦回这个写法很有个性,当第一次看到时,高效、简洁的拆分字符令人佩服,但到后期使用时就看到不足。
梦回也曾说过,我那个分析很复杂,的确是有的复杂,其实也可以写简单一点,除了个开头需多几个判断之外,下面的也可以几句完成的。

function decode(value:String):Array
{


var data:Array = [];
var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
var reg_timeChild:RegExp = /\[(\d\d):(\d\d\.\d\d)\]/g;

var search:Array = value.match(reg_search);

for each (var info:String in search) {

var times:Array = info.match(reg_time);
//去除歌词,获得时间

var lrc:String = info.replace(reg_time,"");
//去除时间,获得歌词


for (var i:int = 0; i < times.length; i++) {

var time_info:String = times[i];
var m:String = time_info.replace(reg_timeChild,"$1");
var s:String = time_info.replace(reg_timeChild,"$2");
var time:Number = (Number(m) * 60 + Number(s))*1000;
data.push({time:time , lrc:lrc });

}

}

return data;

}

返回是一个Aray,调用Array[index].time和Array[index].lrc

第一个正则用于采集 var reg_search:RegExp = /\[\d\d:\d\d\.\d\d\].*/g;
.代表任何一个字符但除了换行符"\n",*代表重复一次或多次,所以将全部字符搜寻并很巧妙地去除了换行符

第二个正则用于匹配时间 var reg_time:RegExp = /(\[\d\d:\d\d\.\d\d\])/g;
[00:02.00]
[00:06.23]
大家都有共同点
/(\[\d\d:\d\d\.\d\d\])/g; 一下子就将全搜索出来


第三个正则/\[(\d\d):(\d\d\.\d\d)\]/g;
将时间分成两个子使用,就会被的$1或$2来引用,所以能巧妙地去掉了[]号



正则表达式概念上简单,但真正运用起来难度想必是比较大的,
写得好与不好,看的是一个人认知事物规律、分析具体问题的能力和组织算法的能力。


前几天在网上收集到一个AS3的歌词同步MP3播放器基础模型,
是文档类的格式,全部代码仅仅只有66行。其中LRC解析就一句正则,相关代码二十几行。

我加了一行“lrc_txt.autoSize="center";”,做了个实例,帖出全部代码,供大家参考:










package {
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.Event;
import flash.text.TextField;
import flash.system.System;
public class LRCMp3Player extends Sprite {
var lrc_txt:TextField=new TextField();
var LRCarray:Array=new Array();
var sc:SoundChannel;
public function LRCMp3Player() {
System.useCodePage=true;
lrc_txt.width=500;
lrc_txt.autoSize="center";
addChild(lrc_txt);
var loader:URLLoader=new URLLoader();
loader.load(new URLRequest("http://dreamdesign.105.idcxin.com/bbs/menber/yypz/mp3/lrc/sydjj.txt"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
var sound:Sound=new Sound();
sound.load(new URLRequest("http://dreamdesign.105.idcxin.com/bbs/./menber/yypz/mp3/朗诵吟咏/四月的纪念-独语VS秒龄音.tif"));
sc=sound.play();
stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
}
function SoundPlaying(evt:Event):void {
for (var i=1; i<LRCarray.length; i++) {
if (sc.position<LRCarray[i].timer) {
lrc_txt.text=LRCarray[i-1].lyric;
break;
}
lrc_txt.text=LRCarray[LRCarray.length-1].lyric;
}
}
function LoadFinish(evt:Event):void {
var list:String=evt.target.data;
var listarray:Array=list.split("\n");
var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;
for (var i=0; i<listarray.length; i++) {
var info:String=listarray[i];
var len:int=info.match(reg).length;
var timeAry:Array=info.match(reg);
var lyric:String=info.substr(len*10);
for (var k:int=0; k<timeAry.length; k++) {
var obj:Object=new Object();
var ctime:String=timeAry[k];
var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
obj.timer=ntime*1000;
obj.lyric=lyric;
LRCarray.push(obj);
}
}
LRCarray.sort(compare);
}
private function compare(paraA:Object,paraB:Object):int {
if (paraA.timer>paraB.timer) {
return 1;
}
if (paraA.timer<paraB.timer) {
return -1;
}
return 0;
}
}
}




哎呀~~~印用kellyxwj那句,"貌似超简洁、高效的说"

var lyric:String=info.substr(len*10);这句非常妙,怎么我就没想到的啊

一个字,妙!!!这个很值得学习!!

 
wu2011

回复时间:2013-8-23 02:40
顺便回复枳橘吟:

return 视乎个人写法而已,函数带返回值,就返回该类型,如果函数不带返回值,就不再执行后面的代码
如:
var playing:Boolean;

function click():void
{
if (playing) {
return;
}

不再执行后面的代码
}


又如:

var index:int = 5;

for (var i:int=0; i<10; i++) {
if (i === index) {
return;

符合条件不再执行,跟break一样跳出循环
}
}

至于你说的空函数写一个return,好象没什么意义,是原代码还是破解的代码

 
枳橘吟

回复时间:2013-8-23 09:56

原帖由 wu2011 于 2013-8-23 02:40 发表
顺便回复枳橘吟:

return 视乎个人写法而已,函数带返回值,就返回该类型,如果函数不带返回值,就不再执行后面的代码
如:
var playing:Boolean;
function click():void
{
if (playing) {
return;
}
不再执行后面的代码
}

又如:
var index:int = 5;
for (var i:int=0; i<10; i++) {
if (i === index) {
return;
符合条件不再执行,跟break一样跳出循环
}
}

至于你说的空函数写一个return,好象没什么意义,是原代码还是破解的代码

  感谢 wu2011君 关心。

  关于 return ,请见于下一例,是反编优酷播放器得来的。类文件名:loading_new.as
package
{
  import flash.display.*;
  dynamic public class Loading_pic extends MovieClip
  {
    public function Loading_pic()
    {
      return;
    }
  }
}

  问好。

[本帖最后由 枳橘吟 于 2013-8-23 09:58 编辑]

 
wu2011

回复时间:2013-8-23 10:47

原帖由 枳橘吟 于 2013-8-23 09:56 发表

原帖由 wu2011 于 2013-8-23 02:40 发表
顺便回复枳橘吟:

return 视乎个人写法而已,函数带返回值,就返回该类型,如果函数不带返回值,就不再执行后面的代码
如:
var playing:Boolean;
function click():void
{
if (playing) {
return;
}
不再执行后面的代码
}

又如:
var index:int = 5;
for (var i:int=0; i<10; i++) {
if (i === index) {
return;
符合条件不再执行,跟break一样跳出循环
}
}

至于你说的空函数写一个return,好象没什么意义,是原代码还是破解的代码

  感谢 wu2011君 关心。

  关于 return ,请见于下一例,是反编优酷播放器得来的。类文件名:loading_new.as
package
{
  import flash.display.*;
  dynamic public class Loading_pic extends MovieClip
  {
    public function Loading_pic()
    {
      return;
    }
  }
}

  问好。

[本帖最后由 枳橘吟 于 2013-8-23 09:58 编辑]


我猜就是破解版的代码,一个没有代码的MovieClip,将实例化后,虽然你没写代码,
flash己经为它添加代码了,因为在AS3每个对象皆是类,所以它添加的是一个类文件的代码格式,只不过它的构造函数是空的。
有的软件破解后函数内出现return,有的是没有的,这个不需理会!

 
枳橘吟

回复时间:2013-8-23 11:01

原帖由 wu2011 于 2013-8-23 10:47 发表
我猜就是破解版的代码,一个没有代码的MovieClip,将实例化后,虽然你没写代码,
flash己经为它添加代码了,因为在AS3每个对象皆是类,所以它添加的是一个类文件的代码格式,只不过它的构造函数是空的。
有的软件破解后函数内出现return,有的是没有的,这个不需理会!

  感谢 wu2011君 解惑,及惑之来龙去脉。
  这么说,删除这个类文件也是可以的。
  问好。

 
wzyh

回复时间:2013-8-23 16:37
支持一下!

 
zisedemeng

回复时间:2013-8-25 19:48
看不懂

 
霜姿冰蕊

回复时间:2013-8-25 22:32
很好,喜欢,谢谢分享!

 
haisan8

回复时间:2013-8-26 20:08
谢谢楼主分享!

 
465969094

回复时间:2013-8-29 12:29
歌词背景用白色似乎不好看。。。

 
梦回轻狂

回复时间:2013-8-29 13:42

原帖由 465969094 于 2013-8-29 12:29 发表
歌词背景用白色似乎不好看。。。


歌词条没有背景色,是透明的,白色是发布时在HTML里面设置的,窗口模式。




----------------------------------------------

  能跑的不如能吃的,能吃的不如能睡的;睡觉是头等大事,吃饭是二等大事,运动是三等大事,其余的都是小事。


  中医认为药物和食物是同源的,自古就秉持“寓医于食”的防病治病理念。《黄帝内经》云:“大毒治病十去其六;常毒治病十去其七,小毒治病十去其八,无毒治病十去其九”,“先进厨房,后进药房”的说法在民间更是广为流传。

  食园有路心作引,厨海无涯汗推舟……

 
放飞美丽

回复时间:2013-8-30 09:44
学习下呢

 
星星眨眼

回复时间:2013-8-30 23:30

原帖由 jy02453368 于 2013-8-19 10:12 发表
谢谢楼主分享!

 
hjs1500

回复时间:2013-8-31 07:15
梦回AS2纯代码卡拉OK动态歌词同步配图MP3播放器,特棒。谢谢

 
tcwu789

回复时间:2013-9-1 15:42
太强大了,感谢云阳斑竹详解分享!

 
deng56

回复时间:2013-9-2 19:49
感谢楼主,重温经典

 
天地人2013

回复时间:2013-9-8 22:57
强大强大强大,感谢一叶老师

 
发新帖 新投票
 回帖
查看积分策略说明快速回复主题
你的用户名: 密码:   免费注册(只要30秒)


启用 Html 代码
使用个人签名
(请您文明上网理性发言!并遵守相关规定
   



Processed in 0.032465 s, 8 q - 无图精简版,sitemap,