flash实时音乐真实频率变化(全as)正在直播教程

作者:袖梨 2022-07-02


效果显示:http://k.thec.cn/liuping2006/music_jump_line/music_jump_line.swf


如果感大家兴趣,我将介绍制作方法。

实时音频跳动条的制作
Flash对声音的处理主要有:
就目前Flash的已有版本(Flash5、FlashMX、Flash2004、Flash8),Flash对声音文件的处理能力还是不够强大的。
mp3是目前网络上最为大众的声音格式,原因是mp3有高效率的压缩(约1/12),并能很好地保持原有声音的音质。
Flash有两种播放mp3的方法,一是将mp3导入Flash内部(直接放在时间帧上,如果声音文件较大,则会占用很多的帧;放在库中,用AS绑定声音),尽管flash可以再次压缩mp3,但仍会使swf文件增肥;二是将mp3放置在Flash外部,用AS将外部的mp3导入到swf播放文件中。但不管上述那种方法,都不能实时显示声音文件的频谱数据。在播放声音时,如果能实时地显示声音的频谱特性,像一些著名媒体播放器那样在播放声音时有许多跳动小块伴随着美妙的音乐舞动身姿,对欣赏者来说能起到“声色俱全”的作用。
   Flash本身不能直接采集到声音文件中的频谱数据,必需借助其它软件,如FlashAmp(适合较小mp3文件,Flash通过数组存贮来自FlashAmp收集到的mp3频谱数据,而如果mp3文件较大时,FlashAmp收集到的mp3频谱数据将会十分庞大)。而另一软件SwiftMP3在将mp3转成为swf时存贮了来自mp3中的音频数据等,并以变量名s0、s1、s2、s3、……、s17共18个变量表示。如某个mp3通过SwiftMP3转换成的swf中存贮了来自mp3中的下列数据:
Title = "";
Artist = "";
Album = "";
Id3 = "1";
// [Action in Frame 2]
// [Action in Frame 3]
s0 = "1";
s1 = "11";
s2 = "4";
s3 = "3";
s4 = "2";
s5 = "6";
s6 = "2";
s7 = "3";
s8 = "4";
s9 = "3";
s10 = "2";
s11 = "2";
s12 = "1";
s13 = "2";
s14 = "1";
s15 = "1";
s16 = "1";
s17 = "1";
// [Action in Frame 4]
s0 = "3";
s1 = "5";
s2 = "8";
s3 = "1";
s4 = "4";
s5 = "2";
s6 = "1";
s7 = "2";
s8 = "3";
s9 = "1";
s10 = "3";
s11 = "4";
s12 = "1";
s13 = "2";
s14 = "1";
s15 = "5";
s16 = "2";
//由于篇幅原因,中间部分省略
tellTarget("_level0"){
    stop();
    gotoAndPlay("");}

因此,在Flash中可以访问上述表中的所有变量,如标题名”Title”、艺术家” Artist”、专集” Album”、 Id3的值以及每一帧上的变量名及其变量值(s0 = "1";s1 = "11";s2 = "4";……;s17 = "2";)。下以一实例说明如何访问mp3中变量完成Flash中实时音频跳动条的制作
一、        准备素材
利用SwiftMP3处理几首mp3为swf,此名称分别为1.swf、2.swf、3.swf、….,并存放在一个名为mousic_lib的文件夹里。
二、        制作过程
①打开Flash新建一名为music_jump_line.fla的文件。设置此flash文件场景大小为89*70(目的是为以后其它场合需要它作为小附件时的调用)。
②创建一个名称为music_cell电影元件,它在库中的链接名取为music_cell,在此music_cell电影元件内图层1上创建3个关键帧。把主代码封存在一个电影元件里的目的也是为以后其它flash里要使用这个实时音频跳动条时提供方便,直接复制过去就行了。
在第1个关键帧上写如下as:
var g = 1;//定义一个变量g,用它来控制外部包含mp3音乐的1.swf、2.swf、3.swf文件名。
在第2个关键帧上写如下as:
stop();
//.................1.................
var col = 0x51E450;
//跳动块色
var colbt = 0xDDCE22;
//按钮色
var txtcol = 0xFFFFFF;
//进度显示字体颜色
this.createEmptyMovieClip("line_cell", 1);
with (line_cell) {
        moveTo(0, 0);
        beginFill(col);
        lineTo(4, 0);
        lineTo(4, 2);
        lineTo(0, 2);
        endFill();
        _visible = 0;
}
//......1........音乐跳动小块
//................2...................
for (var i = 0; i<18; i++) {
        line_cell.duplicateMovieClip("line_cell"+i, i+20,{_x: 5*i,_y:-1});        
        line_cell.duplicateMovieClip("m"+i, 40+I,{_x:5*i});        
}
//......2.....以上为最上层跳动块以及跳动竖条
this.createEmptyMovieClip("mm", 0);
mm.loadMovie("mousic_lib/"+g+".swf");
//.................3...................
onEnterFrame = function () {
        var mm_c = mm._currentframe;
        var mm_t = mm._totalframes;
        var mm_p = Math.round((100*mm_c/mm_t)*100)/100;
        if (mm_p<10) {
                pstext.text = "0"+mm_p+"%";
        } else {
                pstext.text = mm_p+"%";
        }
        pstext.setTextFormat(TF);
        // 文本格式设置时特别要注意文字内容必须放在"baifenbitext.setTextFormat(TF);"之前,否则设置无效!!!
        if (mm._currentframe == mm._totalframes) {
                g++;
                mm.loadMovie("mousic_lib/"+g+".swf");
        }
        if (mm.Id3 == undefined) {
                mytext.text = "load..";
                g = 1;
                mm.loadMovie("mousic_lib/"+g+".swf");
        }
        for (i in mm) {
                if (mm<20) {
                        for (var i = 0; i<18; i++) {
                                this["line_cell"+i]._y =-1-mm["s"+i]*4;
this["m"+i]._yscale= Math.floor((this["line_cell"+i]._y-this["m"+i]._y)/this["m"+i]._height)*100;
                        }
                }
        }
};
//.........3........
//....................4.......................
this.createEmptyMovieClip("playbtn", 6);
with (playbtn) {
        moveTo(65, 4);
        beginFill(colbt);
        lineTo(73, 9);
        lineTo(65, 14);
        lineTo(65, 4);
        endFill();
}
this.createEmptyMovieClip("stopbtn", 7);
with (stopbtn) {
        moveTo(14, 4);
        beginFill(colbt);
        lineTo(24, 4);
        lineTo(24, 14);
        lineTo(14, 14);
        lineTo(14, 4);
        endFill();
}
playbtn.onRelease = function() {
        delete onEnterFrame;
        unloadMovie("mm");
        gotoAndPlay(3);
};
stopbtn.onRelease = function() {
        unloadMovie("mm");
        delete onEnterFrame;
};
//.......4.......播放与停止按钮
//..................5..................
this.createEmptyMovieClip("nextbtn", 9);
with (nextbtn) {
        moveTo(80, 4);
        beginFill(colbt);
        lineTo(88, 8);
        lineTo(88, 4);
        lineTo(89, 4);
        lineTo(89, 14);
        lineTo(88, 14);
        lineTo(88, 10);
        lineTo(80, 14);
        lineTo(80, 4);
        endFill();
}
nextbtn.duplicateMovieClip("prevbtn", 10);
prevbtn._xscale = -100;
prevbtn._x = 89;
nextbtn.onRelease = function() {
        delete onEnterFrame;
        unloadMovie("mm");
        g++;
        gotoAndPlay(3);
};
prevbtn.onRelease = function() {
        delete onEnterFrame;
        unloadMovie("mm");
        g--;
        gotoAndPlay(3);
};
//......5......以上为前进与后退按钮
//................6................
this.createTextField("pstext", 8, 25, 2, 41, 20);
TF = new TextFormat();
TF.font = "Arial";
TF.size = 10;
TF.color = colbt;
TF.align = "center";
//........6..........以上为动态显示播放进度的文本
this.createEmptyMovieClip("bjline", -2); //.........背景..........
with (bjline) {
        lineStyle(0, 0x1A7133, 50);
        moveTo(0, 16);
        beginFill(0x003333, 90);
        lineTo(89, 16);
        lineTo(89, -50);
        lineTo(0, -50);
        lineTo(0, 16);
        endFill();
}
this.createEmptyMovieClip("line", -1);//跳动条底座水平线
with (line) {
        lineStyle(0, 0x00FF00, 50);
        moveTo(0, 0);
        lineTo(89, 0);
        lineTo(0, 0);
}
//...............背景"music"字................................
this.createTextField("sxl_text", -20, 10, -59, 70, 26);
TFS = new TextFormat();
TFS.font = "Arial Black";
TFS.size = 20;
TFS.color = 0x003939;
TFS.align = "center";
sxl_text.text = "music";
sxl_text.setTextFormat(TFS);
//...........................................................
在第3个关键帧上写如下as:
gotoAndStop(2);
③回到主场景,在第1帧上写as:
this.attachMovie("music_cell", "mc", 1,{_y:50});
//至此大功告成!
④测试此music_jump_line.swf文件,可以看到舞台上的绿色小精灵随着音乐翩翩起舞。通过下方的几个按钮可以控制音乐的播放与停止,前一首与后一首的选择。
三、        制作后记
1、        基本技术:
①if(条件) {        要执行的指令} 条件循环, 如果条件为 true,则 Flash 将运行条件后面花括号 ({}) 内的语句
②with (对象) {要执行的指令} 动作使用范围,参数计算对象中的表达式和动作。这可以使您不必重复书写对象的名称或路径
③for(初始值; 循环条件; 计算的表达式) {        循环体内要执行的指令} 条件循环
④myMovieClip.createEmptyMovieClip (新实例名, 深度)创建作为现有影片剪辑子级的空影片剪辑方法
⑤myMovieClip.createTextField (新实例名, 深度,x坐标,y坐标,文本宽度,文本高度) 创建作为由 MovieClip 参数指定的影片剪辑子级的新空文本字段的方法
⑥myMovieClip.duplicateMovieClip(新实例名, 深度[,初始值]) 复制影片剪辑方法
⑦myMovieClip.onEnterFrame=function(){}以帧频不断刷新的事件处理函数
⑧myMovieClip.onRelease () {}点击后释放时的事件处理函数
⑨myMovieClip.attachMovie(“库中链接名”, 新实例名, 深度[,初始值] ) 从库中取一个元件并将其附加到舞台上由 MovieClip 指定的影片中的方法
2、        关键技术:
    for (i in mm) {//遍历电影实例mm
        if (mm<20) {//如果mm中的变量个数小于20
        for (var i = 0; i<18; i++) {//因为mm中的变量s有18个
        this["line_cell"+i]._y = -1-mm["s"+i]*2;/*各个跳动小块的高度变化由mm中的对应数值来影响。负号是因为各个跳动小块的注册点在左上角,因此,要使它向上跳动时,其y值应取负;*2是因为增大向上跳动的幅度,使运动明显。
                                外部导入的1.swf、2.swf、….、n.swf。音乐文件中含有音乐数据其变量名为s0、s1、s2、s3、....s17,它们在每一帧上的值都有变化*/
this["m"+i]._yscale= Math.floor((this["line_cell"+i]._y-this["m"+i]._y)/this["m"+i]._height)*100;/*跳动小竖条在y轴方向上的缩放由上述的跳动小块的y值决定*/
                        }
                }
        }
};
3、        基本特点:
①        此软件按顺序播放外部音乐swf文件,到最后一首时会自动跳到第一首从头再播,一直loop。
②        外部音乐swf文件可以不指定个数,music_jump_line.swf会自动控制播放。

相关文章

精彩推荐