• AS3 歌词同步


    这里实例素材:

    我们不一样.lrc

    我们不一样.mp3

    歌词同步其实就是靠lrc文本文件,打开它,可以看到时间点和对应的歌词。

    打开lrc内容如下:

    [ti:我们不一样]
    [ar:大壮]
    [al:]
    [by:错爱QQ]
    [t_time:(04:30)]
    [00:00.00]歌词千寻 www.lrcgc.com
    [00:01.11]我们不一样
    [00:05.07]演唱:大壮
    [00:08.26]词曲:高进
    [00:11.29]编曲:张亮
    [00:14.85]缩混:侯春阳
    [00:20.04]
    [00:34.81]这么多年的兄弟
    [00:37.27]有谁比我更了解你
    [00:41.52]太多太多不容易
    [00:43.90]磨平了岁月和脾气
    [00:48.35]时间转眼就过去
    [00:50.90]这身后不散的筵席
    [00:54.52]只因为我们还在
    [00:57.39]心留在原地
    [00:59.39]
    [01:01.41]张开手需要多大的勇气
    [01:08.37]这片天你我一起撑起
    [01:15.10]更努力只为了我们想要的明天
    [01:21.85]好好的这份情好好珍惜
    [01:26.81]
    [01:28.85]我们不一样
    [01:31.77]每一个人都有不同的境遇
    [01:35.83]我们在这里在这里等你
    [01:42.27]我们不一样
    [01:45.26]虽然会经历不同的事情
    [01:49.48]我们都希望来生还能相遇
    [01:55.28]
    [01:57.29]这么多年的兄弟
    [01:59.85]有谁比我更了解你
    [02:04.12]太多太多不容易
    [02:06.51]磨平了岁月和脾气
    [02:10.73]时间转眼就过去
    [02:13.30]这身后不散的筵席
    [02:16.94]只因为我们还在
    [02:19.64]心留在原地
    [02:23.76]张开手需要多大的勇气
    [02:30.51]这片天你我一起撑起
    [02:36.66]更努力只为了我们想要的明天
    [02:44.16]好好的这份情好好珍惜
    [02:49.19]
    [02:51.26]我们不一样
    [02:53.81]每一个人都有不同的境遇
    [02:58.14]我们在这里在这里等你
    [03:04.87]我们不一样
    [03:07.49]虽然会经历不同的事情
    [03:11.80]我们都希望来生还能相遇
    [03:17.44]
    [03:34.16]我们不一样
    [03:36.91]每一个人都有不同的境遇
    [03:40.73]我们在这里在这里等你
    [03:47.83]我们不一样
    [03:50.50]虽然会经历不同的事情
    [03:54.63]我们都希望来生还能相遇
    [04:01.18]我们不一样
    [04:04.21]虽然会经历不同的事情
    [04:08.36]我们都希望来生还能相遇
    [04:15.23]我们都希望来生还能相遇
    [04:21.20]歌词编辑:错爱QQ 1320395669
    [04:25.86]


    找歌词,上歌词千寻 www.lrcgc.com。支持歌词找歌名,LRC歌词免费下载。

    歌词同步原理很简单,就是将时间点转换为以毫秒为单位的时间,然后根据歌曲播放的position也就是播放到的时间,显示对应的歌词。

    简单源码如下:

    //装载歌词时间与内容
    var lrcArr:Array = new Array();
    //加载声音的类
    var sd:Sound = new Sound();
    //开始加载外部歌曲
    sd.load(new URLRequest("我们不一样.mp3"));
    //开始播放,并将其赋值给SoundChannel类对象,这样才可以获取播放的进度
    var sdCtrl:SoundChannel = sd.play();
    //加载lrc文本的类对象
    var urlLdr:URLLoader = new URLLoader();
    //开始加载歌词文本
    urlLdr.load(new URLRequest("我们不一样.lrc"));
    //侦听歌词文本是否加载完毕
    urlLdr.addEventListener(Event.COMPLETE,onLoad_Fun);
    
    //歌词文本加载完毕
    function onLoad_Fun(e:Event):void{
    	//将歌词文本全部内容存入str变量
    	var str:String = urlLdr.data;
    	//根据换行符转化成数组
    	var childArr:Array = str.split("
    ");
    	//正则表达式,大致内容就是获取时间
    	var reg:RegExp = /[[0-5][0-9]:[0-5][0-9].[0-9][0-9]]/g;
    	//循环整个数组
    	for (var i:int=0; i<childArr.length; i++){
    		//将数组某个内容赋值到变量newStr
    		var newStr:String = childArr[i] as String;
    		//根据表达式获取时间存入数组timeArr
    		var timeArr:Array = newStr.match(reg);
    		//循环整个时间
    		for (var j:int = 0; j<timeArr.length; j++){
    			var theLastStr:String = timeArr[j] as String;			
    			var obj:Object = new Object();
    			//将时间转换为毫秒
    			obj.time = (Number(theLastStr.substr(1,2))*60 + Number(theLastStr.substr(4,5)))*1000;
    			//将歌词存入obj.lrc  因为时间是[00:05.07]共10个字符串,则从第10个字符串开始截取,则为歌词内容
    			obj.lrc = newStr.substr(timeArr.length * 10) as String;			
    			lrcArr.push(obj);
    		}
    	}
    	//添加帧侦听
    	this.addEventListener(Event.ENTER_FRAME,onEnter_Fun);
    }
    
    function onEnter_Fun(e:Event):void{
    	//当文本的时间小于播放的时间,则显示对应的歌词
    	for (var i:int=0; i<lrcArr.length; i++){
    		var newObj:Object = lrcArr[i];
    		if (newObj.time < sdCtrl.position){
    			lrc_txt.text = newObj.lrc;
    		}
    	}
    }
    

      

  • 相关阅读:
    Oracle中的substr()函数和INSTR()函数和mysql中substring_index函数字符截取函数用法:计算BOM系数用量拼接字符串*计算值方法
    (转载)SDRAM驱动笔记
    【转】Verilog阻塞与非阻塞赋值使用要点
    【转转】(筆記) always block內省略else所代表的電路 (SOC) (Verilog)
    (原創) 如何處理signed integer的加法運算與overflow? (SOC) (Verilog)
    [转载]亚稳态
    Dev Exprss 发布部署
    Dev splliter 去除中间的分割显示
    DevTreeList中的新增、修改的设计
    Oracle 常用网址
  • 原文地址:https://www.cnblogs.com/dt1991/p/9162684.html
Copyright © 2020-2023  润新知