发新帖  新投票  回帖 
312950个阅读者,296条回复 | 打印 | 订阅 | 收藏
六月雨2011

发表时间:2013-7-2 15:51

[分享]以前制作歌词同步频谱播放器(频谱+播放器源文件下载)



六月雨2011 发表在 音乐播放器 华声论坛 http://bbs.voc.com.cn/forum-344-1.html

[全屏欣赏]


**** 本内容跟帖回复才可浏览 *****

本帖助威记录

离别的浪漫 +1
牛!估计我这辈子再也见不到这样的帖子了
2014-06-30 18:32:55
白雪无痕hh +1
你的帖子可以上新闻联播了
2014-04-28 20:31:25
明月望娥 +1
很漂亮,谢谢分享
2014-04-11 16:05:06
caoyuansq +1
牛,真正好东西!
2014-04-10 18:26:56
昨日依然 +1
牛!估计我这辈子再也见不到这样的帖子了
2013-11-27 22:51:29
总计:魅力7点 助威7查看所有助威>>



----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
司马有道

回复时间:2013-7-2 16:25
学习

 
hhy0927

回复时间:2013-7-2 16:30
呵呵~好玩,不知是以前什么时候制作的,学习下~




----------------------------------------------
 
漂来风

回复时间:2013-7-2 17:07
看看,有什么不一样

 
六月雨2011

回复时间:2013-7-2 17:13
在此说明下2.0的播放器源代码来源于秋风老师.本人只是把播放器和频谱组合在一起。




----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
漂来风

回复时间:2013-7-2 17:15
as2.0 还是破解的格式,不便阅读和学习

[本帖最后由 漂来风 于 2013-7-2 17:20 编辑]

 
漂来风

回复时间:2013-7-2 17:25

原帖由 六月雨2011 于 2013-7-2 17:13 发表
在此说明下2.0的播放器源代码来源于秋风老师.本人只是把播放器和频谱组合在一起。


建议:AS2.0的播放器有很多开源项目,AS3.0的也很多,还是学习一下AS3.0的吧!

 
六月雨2011

回复时间:2013-7-2 17:32

原帖由 漂来风 于 2013-7-2 17:25 发表

原帖由 六月雨2011 于 2013-7-2 17:13 发表
在此说明下2.0的播放器源代码来源于秋风老师.本人只是把播放器和频谱组合在一起。


建议:AS2.0的播放器有很多开源项目,AS3.0的也很多,还是学习一下AS3.0的吧!

此播放器是频谱加载的,而不是学习制作2.0播放器。如果你需要3.0的我也可以源码发你。不管是2.0还是3.0的我都在学习,我也希望你把3.0作品展现给大家.




----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
漂来风

回复时间:2013-7-2 17:43
比如歌词同步,你看一下AS3.0的代码,和你的效果是一样的

歌词分析类
/*
* 歌词文件读取分析类

* 说明:该类提供的方法可以将歌词文件从加载到分析再到输出一部完成
* 支持标准的lrc格式或xml格式的文件
* 使用用法:实例化该类( 文件地址 , [编码])
* new ( url:String [, code:String = "gb2312"] );
* 属性:lrcToArray , 只读属性 , 获取已转换完成的歌词文件 , 为了方便操作,数据类型为数组
* lrcToString ,只读属性 , 获取以加载的歌词文件的文本数据
* 外部方法: strToData( data:String ) , 实例化时没有设置地址参数的时候,也可以通过这个方法解析外部已加载
的str数据
* 事件:"complete" , 加载成功并分析完毕;
"error" , 歌词分析发生错误
* 注: 当这两种事件任何一个激发时都说明歌词文件加载成功 , 反而说明歌词加载不成功 ,并没有得到分析
请检查歌词文件的路径是否正确
*
**********/

package {

import flash.events.EventDispatcher;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.utils.ByteArray;
import flash.xml.*;

public class LrcReader extends EventDispatcher {

private var byte:ByteArray;
private var lrcStr:String;
private var timeArr:Array;
private var lrcArr:Array;
private var reg:RegExp;
private var lrccode:String;
private var gs:String;
private var xmld:XML;

//实例化(文件路径,编码 )
public function LrcReader( url:String = null , code:String = "gb2312" ) {
byte = new ByteArray();
lrcStr="";
timeArr=[];
lrcArr=[];
reg=/[\n\r]/;
lrccode=code;
if( url != null ){

var loader:URLLoader = new URLLoader();
var urlrq:URLRequest = new URLRequest( url );

if( url.slice( url.length - 3 , url.length ) != "xml" ){
loader.dataFormat = URLLoaderDataFormat.BINARY;
gs = "txt";
}else{
gs = "xml";
}

loader.load( urlrq );
loader.addEventListener(Event.COMPLETE , loadComplete );
}
}

//歌词加载完成
private function loadComplete( e:Event ):void {
if( gs == "txt" ){
byte = e.target.data as ByteArray;
lrcStr = byte.readMultiByte( byte.bytesAvailable , lrccode );
strToData( lrcStr );
}else{
xmld = new XML( e.target.data );
xmlToData( xmld );
}

}

//分析歌词
public function strToData( strdata:String ){
timeArr=redTime(strdata,"[","]");
lrcArr=redLrc(strdata,"]");
breakFinish();
}

//分析xml歌词
public function xmlToData( xm:XML ){
for( var xl:int = 0; xl < xm.Lyrics.Lrc.length() ; xl ++ ){
timeArr.push( int( Number( xm.Lyrics.Lrc[ xl ].@Tag ) / 10 ));
if( xm.Lyrics.Lrc[ xl ] == "" ){
lrcArr.push("-" );
}else{
lrcArr.push( xm.Lyrics.Lrc[ xl ] );
}
}

breakFinish();
}

//分解完毕
private function breakFinish(){
if (timeArr.length>0&&lrcArr.length>0&&timeArr.length==lrcArr.length) {
this.dispatchEvent( new Event ("complete"));
} else {
this.dispatchEvent( new Event ("error"));
trace( timeArr.length );
trace( lrcArr.length );
}
}

//读取并分析歌词文件里的时间
private function redTime( obj:String , fst:String , end:String ):Array {

var arr:Array=[];
var tim:Array=[];

var ih:Boolean=false;
var st:int=0;
var et:int=0;
var sr:String = "";

for (var i = 0; i < obj.length; i ++) {

if (obj.charAt(i)==fst) {
st=i;
ih=true;
}

if (obj.charAt(i)==end&&ih) {
et=i;
if (ih) {
ih=false;
if (isNaN(Number(obj.charAt(st+1)))==false) {
arr.push( obj.slice( st + 1 , et ) );
}else{
arr.push( "00:00.00" );
}
}
}

}

for (var a in arr) {
tim.push( strToNumber( arr[a] ));
}

return tim;

}

//将文本格式的时间转换成数字格式
private function strToNumber( strs:String ):Number {

var num:Array=[];
var nums:Number=0;

for (var s:int = 0 ; s < strs.length ; s++ ) {
if ( isNaN(Number(strs.charAt(s))) == false ) {
num.push( Number( strs.charAt( s ) ));
}
}

//歌词文件的时间模式为[01:59.99]
nums=num[5];
nums+=num[4]*10;
nums+=num[3]*100;
nums+=num[2]*1000;
nums+=num[1]*1000*6;
nums+=num[0]*1000*60;

return nums;

}

//读取并分析歌词文件里的歌词部分
private function redLrc( obj:String , fst:String ):Array {

var lra:Array=[];
var ih:Boolean=false;
var st:int=0;
var et:int=0;
var sr:String = "";

for (var i = 0; i < obj.length; i ++) {
if (obj.charAt(i)==fst) {
st=i;
ih = true;
}
if (ih) {
if (reg.test(obj.charAt(i))==true) {
sr = obj.slice( st + 1 , i );
if( sr.length == 0 ){
sr = " ";
}
lra.push(sr);
ih=false;
}
}
}

return lra;

}

//获取已分析的歌词数据
public function get lrcToArray():Array {
var lrcdata:Array=[];
if (timeArr.length==lrcArr.length) {
for (var j in timeArr) {
lrcdata.push([timeArr[j],lrcArr[j]]);
}
}

return lrcdata;
}

//获取文本形式的歌词数据
public function get lrcToString():String {
return lrcStr;
}

}
}

 
漂来风

回复时间:2013-7-2 17:50
这是调用该类的方法,你很聪明,马上就可以制作一个播放器了!新建一个FLA,拷贝代码。。。。

import LrcReader;
var bgm:Sound = new Sound();
var sc:SoundChannel = new SoundChannel();
bgm.load( new URLRequest("mp3/伤不起.mp3"));
SoundMixer.bufferTime = 10;
sc = bgm.play();
sc.addEventListener( Event.SOUND_COMPLETE , replay );

var timer:Timer = new Timer( 10 );
timer.addEventListener( "timer" , loop );
timer.start();

//调用LrcReader类加载并分析出歌词数据
var lrcdata:Array = [];
var lcl:LrcReader = new LrcReader("lrc/伤不起.txt");
lcl.addEventListener( "complete" , lrcHandler );
lcl.addEventListener( "error" , lrcHandler );

function lrcHandler( e ){
if( e.type == "complete" ){
lrcdata = lcl.lrcToArray ;
}else{
trace("歌词分析失败!");
}
}

//显示歌词
var i:int = 0;

txt.autoSize = "left";
txtbg.autoSize = "left";
txtbg.mask = bar;

var ct:int = 0;
var tt:int = 0;

function loop( e ){
for( var l = i ; l < lrcdata.length ; l++ ){
if( int( sc.position / 10 ) >= lrcdata[l][0] ){
txt.text = lrcdata[l][1];
txtbg.text = txt.text;
ct = lrcdata[l][0] * 10;
if( l < lrcdata.length - 1 ){
tt = lrcdata[l + 1][0] * 10;
}else{
tt = bgm.length;
}
if( l + 1 < lrcdata.length ){
txtb.text = lrcdata[l+1][1];
}else{
txtb.text = "";
}
if( l + 2 < lrcdata.length ){
txtbb.text = lrcdata[l+2][1];
}else{
txtbb.text = "";
}
if( l - 1 >= 0 ){
txta.text = lrcdata[l-1][1];
}else{
txta.text = "";
}
if( l - 2 >= 0 ){
txtaa.text = lrcdata[l-2][1];
}else{
txtaa.text = "";
}
i++;
break;
}
}

bar.width = ( sc.position - ct ) / ( tt - ct ) * txtbg.width;

}

//
function replay( e ){
sc.stop();
sc = bgm.play();
sc.addEventListener( Event.SOUND_COMPLETE , replay );
i = 0;
}

 
漂来风

回复时间:2013-7-2 17:55
至于调用频谱,加以下代码。。。


//调用频谱
var revolt:Revolt = new Revolt(bgm ,349,279);
addChild(revolt);

 
六月雨2011

回复时间:2013-7-2 18:12

原帖由 漂来风 于 2013-7-2 17:55 发表
至于调用频谱,加以下代码。。。


//调用频谱
var revolt:Revolt = new Revolt(bgm ,349,279);
addChild(revolt);

你这么一说,很感慨,真想看看你的代表作品。有佳作吗?发下链接,叫我们欣赏下。这些代码似成相识。




----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
zsctqz

回复时间:2013-7-2 18:13
谢谢分享源码!

 
六月雨2011

回复时间:2013-7-2 18:29
本人也是学习制作,高手和不需要此播放器的请绕行,谢谢!




----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
jsjcyg

回复时间:2013-7-2 18:43
谢谢分享,收藏学习。

 
林舞二山

回复时间:2013-7-2 20:41
下载学习 谢谢楼主分享~~~谢谢~~~~~~




----------------------------------------------
[font color=#330099]每天早上起床看一眼《福布斯》上面没我的名字 我就继续上班.
 
465969094

回复时间:2013-7-2 21:12
学习AS3。0有什么捷径吗?

 
jsjcyg

回复时间:2013-7-2 21:33
源文件用cs4打不开,显示“意外的文件格式”,请问用那个版本打开?

 
六月雨2011

回复时间:2013-7-3 06:57

原帖由 jsjcyg 于 2013-7-2 21:33 发表
源文件用cs4打不开,显示“意外的文件格式”,请问用那个版本打开?

as2.0播放器是CS4,加载频谱播放器是CS5.5,建议用CS6打开频谱播放器




----------------------------------------------
美的事物是永恒的喜悦。如果笑靥如花,如果风情万种,如果那般决绝。那么让我们一起聆听吧!
 
凤鸣

回复时间:2013-7-3 11:54
喜欢有歌词显示的播放器。

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


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



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