说明:这个歌词秀既可演示字幕,又可编辑歌词
当左上角显示为演示状态时,点击“播放”即可演示字幕
当显示为编辑状态时,点击“记时”既可为歌词添加时间标签
时间标签中包含每个句子的起始时间和结束时间,均用60进制表示,
最末位的单位是60分之一秒
演示地址:http://www.5dblog.com/user2/jh7086/index.ASP?id=40562
这个也是:http://www.5dblog.com/user2/jh7086/index.ASP?id=40820
还有这个:http://www.5dblog.com/user2/jh7086/?id=38245
作了些改进(下面的代码已更新),消除了一些BUG,杂乱的代码也整理了一下
更重要的是,现在只要建立一个与swf同名的txt文件并放在同一目录下,
即可通过更改txt的内容来加载不同的歌词和mp3,而不必再修改源文件了
--------------------完全AS实现-------------------------------
System.useCodepage = true;
//加载外部文本文件(文件路径,目标地址[,变量名称[,加载完毕后执行的函数]])
function loadTXT(url:String, temp:Object, func:Function) {
var depth = this.getNextHighestDepth();
var mc = this.createEmptyMovieClip("MC"+depth, depth);
var tt = setInterval(test, 50);
loadVariables(url, mc);
function test() {
if (mc.txtend != undefined) {
temp.data = mc.jhdata;
if (func != null) {
func();
}
removeMovieClip(mc);
clearInterval(tt);
}
}
}
//将10进制数N转换成d进制数(以0-9,A-Z,a-z字符表示),d为2-62
function jh_10toD(N:Number, d:Number) {
N = Math.floor(N);
d = d<2 ? 2 : d>62 ? 62 : d;
var s, e = "";
while (N>0) {
s = N%d;
if (s>35) {
//36至62的数用a-z字符表示(s-36+97)
s = String.fromCharCode(s+61);
} else if (s>9) {
//10至35的数用A-Z字符表示(s-10+65)
s = String.fromCharCode(s+55);
}
e = s+e;
N = Math.floor(N/d);
}
e = e != "" ? e : "0";
return e;
}
//将d进制数str转换为10进制
function jh_Dto10(str:String, d:Number) {
var code = 0, num = 0;
for (var i = 0; i<str.length; i++) {
code = str.charCodeAt(i);
if (code>96) {
code -= 61;
} else if (code>64) {
code -= 55;
} else {
code -= 48;
}
num += code*Math.pow(d, str.length-1-i);
}
return num;
}
//建立文本按钮(按钮字符,函数名,坐标,mc)
function get_button(BTtext:String, func:String, x:Number, y:Number, mc:MovieClip) {
mc = mc != null ? mc : this;
var depth = mc.getNextHighestDepth();
mc.createTextField("BT"+depth, depth, x, y, 15*BTtext.length, 20);
with (eval("BT"+depth)) {
selectable = false;
HTML = true;
HTMLText = "<A HREF=\"asfunction:"+func+"\"><font color=’#cc3300’>"+BTtext+"</A>";
}
}
//歌词处理:提取出每行的时间(换算为毫秒数)和歌词,存入数组(演示字幕用)
//如果没有时间信息,按同样格式转换,stime和etime置为""
function toarray(geci) {
geci = geci.split("\r\n");
for (var i in geci) {
var temp = geci[i];
var index1 = temp.indexOf(",");
var index2 = temp.indexOf("]");
geci[i] = {};
if (index2 == -1) {
if (temp == "" || temp == " ") {
geci.splice(i, 1);
} else {
geci[i].stime = "";
geci[i].etime = "";
geci[i].txt = temp;
}
} else {
geci[i].stime = 100/6*jh_Dto10(temp.slice(1, index1), 60);
geci[i].etime = 100/6*jh_Dto10(temp.slice(index1+1, index2), 60);
geci[i].txt = temp.slice(index2+1);
}
}
return geci;
}
//记录时间(编辑歌词用),geci为Object数组,每个元素包括(stime,etime,txt)
function get_time() {
if (loading.text == "编辑状态") {
var time = myMU.position;
//将1000分之一秒换算为60分之一秒,并转换为60进制数
time = jh_10toD(time/100*6, 60);
var i = Math.floor(counter/2);
if (i<geci0.length) {
if (counter%2 == 0) {
geci0[i].stime = "["+time+",";
} else {
geci0[i].etime = time+"]";
}
var newHTML = "<P align=’center’>";
var sline = Math.max(i-2, 0);
var eline = Math.max(Math.min(i+4, geci0.length), 6);
var tempstr;
for (var j = sline; j<eline; j++) {
tempstr = geci0[j].stime+geci0[j].etime+geci0[j].txt;
if (j == i) {
newHTML += "<FONT color=’#cc6600’><b>"+tempstr+"</b></FONT><BR>";
} else {
newHTML += tempstr+"<BR>";
}
}
in_out.HTMLText = newHTML.slice(0, newHTML.length-4)+"</P>";
counter++;
}
}
}
//字幕演示
function mvtext(music:Sound, geci:Array) {
var tt2 = setInterval(test, 100);
var counter2 = 0;
function test() {
if (loading.text == "演示状态") {
if (music.position-geci[counter2].stime>0) {
while (music.position-geci[counter2].stime>0) {
counter2++;
}
counter2--;
var newHTML = "<P align=’center’>";
var sline = Math.max(counter2-2, 0);
var eline = Math.max(Math.min(counter2+4, geci.length), 6);
for (var i = sline; i<eline; i++) {
if (i == counter2) {
newHTML += "<FONT color=’#cc6600’><b>"+geci[i].txt+"</b></FONT><BR>";
} else {
newHTML += geci[i].txt+"<BR>";
}
}
in_out.HTMLText = newHTML.slice(0, newHTML.length-4)+"</P>";
counter2++;
if (counter2>=geci.length) {
trace("kkkk");
clearInterval(tt2);
}
}
}
}
}
//
//建立状态显示框
this.createTextField("loading", this.getNextHighestDepth(), 13, 10, 100, 20);
loading.textColor = 0x339900;
loading.selectable = false;
loading.text="";
//建立歌词显示框
this.createTextField("in_out", this.getNextHighestDepth(), 10, 10, 280, 100);
in_out.border = true;
in_out.multiline = true;
in_out.HTML = true;
in_out.HTMLText = "";
//全局变量:
var geci0 = {};
var geci;
var counter = 0;
var stime = 0;
var myMU = new Sound(this);
//获取自身文件所在地址,加载同目录下同名txt文件,以获取mp3和txt的信息
var filepath = this._url.substr(0, this._url.length-3)+"txt";
var myurl = {};
loadTXT(filepath, myurl, loadMp3AndTxt);
delete filepath;
//获得mp3和txt的url信息后执行:
function loadMp3AndTxt() {
myurl = myurl.data.split("\r\n");
loadTXT(myurl[0], geci0, begin);
myMU.loadSound(myurl[1], false);
var myintervalID = setInterval(loadingtxt, 100);
function loadingtxt() {
var kk = Math.round(100*myMU.getBytesLoaded()/myMU.getBytesTotal());
if (kk == 100) {
go();
clearInterval(myintervalID);
}else{
loading.text = "加载中"+kk+"%";
}
}
delete myurl;
}
//获得歌词文本后执行:
function begin() {
geci = toarray(geci0.data);
geci0 = new Array();
for(var i=0;i<geci.length;i++){
geci0[i]={};
geci0[i].txt=geci[i].txt;
geci0[i].stime="";
geci0[i].etime="";
}
var newHTML = "<P align=’center’>";
for (var i = 0; i<6; i++) {
newHTML += geci[i].txt+"<BR>";
}
in_out.HTMLText =newHTML.slice(0,newHTML.length-4)+ "</P>";
}
myMU.onLoad = go;
//音乐加载完毕后执行:
function go() {
loading.text = "演示状态";
get_button("[演示]", "_show", 80, 110);
get_button("[编辑]", "_edit", 120, 110);
get_button("[播放]", "_play", 160, 110);
get_button("[暂停]", "_stop", 200, 110);
get_button("[记时] ", "get_time", 240, 110);
}
function _edit() {
loading.text = "编辑状态";
}
function _show() {
loading.text = "演示状态";
}
function _stop() {
stime = myMU.position/1000;
myMU.stop();
}
function _play() {
myMU.stop();
myMU.start(stime);
mvtext(myMU, geci);
}
myMU.onSoundComplete = _play;
this.onMouseUp = function() {
if (eval(Selection.getFocus()) == in_out && loading.text == "编辑状态") {
var temp = "<P align=’center’>";
for (var i = 0; i<geci0.length; i++) {
temp += geci0[i].stime+geci0[i].etime+geci0[i].txt+"<BR>";
}
in_out.HTMLText = temp+"</P>";
Selection.setSelection(0, in_out.length);
}
};
//这是偶的签名类
new _jh7086(100, null, 15, 112); 补充说明:
歌词文件样本:
其中有两个变量:jhdata和txtend,后者用于判断文件加载是否完全
多余的回车换行将被忽略,但整行的空格会被保留。
歌词是流体式的,即使是重复前面的句子,也必须打在文件中
时间的记录采用60进制并非必须,只是为了让它看起来短一些
每个句子记录了两个时间(stime和etime),在上面的演示中只用到stime
但如果要用于做MV,肯定会用到两个时间
---------------------------------------------------
jhdata=[1p,FD]林俊杰 - 江南
[c7,eO]风到这里就思念
[fB,hX]粘住过客的思念
。。。。。。。。。。
。。。。。。。。。。
[3ks,3og]心碎了才懂
[3wB,4Om]............
&txtend=true
---------------------------------------------------目前编辑歌词需要修改源文件中的下面两行
URL_geci = "http://jh7086.nease.net/mp3/林俊杰 - 江南2.txt";
URL_mp3 = "http://jh7086.nease.net/mp3/江南.mp3;
把它们变成你所要编辑的歌词和mp3的地址
其中歌词文件*.txt格式如下:
注意第一行和最后一行,中间的歌词必须对照歌曲稍作编辑,
变成歌词流(只往下流,不能跳转)
----------------------------------------------------
jhdata=
姜育恒——地图
你的心是片遥远的国土
与我相连在一段荒凉路
。。。。。。。。。。
。。。。。。。。。。
只要你能走进我的地图
愿为你选择未来的路
如果你离开了我的地图
我应该如何回到最初
&txtend=true
----------------------------------------------------
做好以上两步后,就可以发布swf了。
打开swf然后点击“编辑”进入编辑状态,再点击“播放”
开始播放音乐,这时就可以点击“记时”为歌词添加时间标签了。
需要注意的是:每行歌词都要记录起始时间和终止时间(这和LRC歌词是不同的)
所以要每行要点击两次才会跳到下一行
音乐播放完后,将整个文本筐的内容拷贝出来把上面的
歌词文件中红色部分替换掉并保存修改,
然后关掉swf重新打开,就可以看字幕效果了
jhdata=[1p,FD]林俊杰 - 江南
[c7,eO]风到这里就思念
[fB,hX]粘住过客的思念
。。。。。。。。。。
。。。。。。。。。。
[3ks,3og]心碎了才懂
[3wB,4Om]............
&txtend=true
---------------------------------------------------目前编辑歌词需要修改源文件中的下面两行
URL_geci = "http://jh7086.nease.net/mp3/林俊杰 - 江南2.txt";
URL_mp3 = "http://jh7086.nease.net/mp3/江南.mp3;
把它们变成你所要编辑的歌词和mp3的地址
其中歌词文件*.txt格式如下:
注意第一行和最后一行,中间的歌词必须对照歌曲稍作编辑,
变成歌词流(只往下流,不能跳转)
----------------------------------------------------
jhdata=
姜育恒——地图
你的心是片遥远的国土
与我相连在一段荒凉路
。。。。。。。。。。
。。。。。。。。。。
只要你能走进我的地图
愿为你选择未来的路
如果你离开了我的地图
我应该如何回到最初
&txtend=true
----------------------------------------------------
做好以上两步后,就可以发布swf了。
打开swf然后点击“编辑”进入编辑状态,再点击“播放”
开始播放音乐,这时就可以点击“记时”为歌词添加时间标签了。
需要注意的是:每行歌词都要记录起始时间和终止时间(这和LRC歌词是不同的)
所以要每行要点击两次才会跳到下一行
音乐播放完后,将整个文本筐的内容拷贝出来把上面的
歌词文件中红色部分替换掉并保存修改,
然后关掉swf重新打开,就可以看字幕效果了
|Flash版 的 配套歌词制作器
下载
http://www.Flash8.net/bbs/dispbbs.ASP?boardID=47&ID=173981&page=1
组件可以在这里下载
dispbbs.ASP?boardID=47&ID=150699&page=1
