lynxr 2008-10-1 12:09
写给为flv播放器字幕同步发愁的朋友
AS3[font=宋体]引入了正则表达式以后,确实为[/font]flash[font=宋体]编程带来了不少方便,例如[/font]MP3[font=宋体]和视频播放的字幕以及歌词同步问题。[/font]
[font=宋体]我以很常见的电影字幕格式来做例子,这是《武状元苏乞儿》最前面的一段字幕内容:[/font]
[font=宋体]演示地址:[/font][url=http://www.i264.net/movie/xj/3129/]http://www.i264.net/movie/xj/3129/[/url]
[font=宋体][code]1
00:01:40,266 --> 00:01:41,233
少爷,准备好了
2
00:02:22,909 --> 00:02:23,637
辛苦了,少爷
3
00:02:23,810 --> 00:02:24,970
少爷,擦个汗吧
4
00:02:34,020 --> 00:02:35,419
师爷,少爷写的是什么?
5
00:02:35,588 --> 00:02:36,612
名字[/code][/font]
[font=宋体]看到这段字幕以后,首先想到了要分离时间戳[/font][font=宋体]00:01:40,266[/font][font=宋体]和字幕内容,我的思路是这样的:[/font]
[font=宋体]加载字幕:[/font]
[font=宋体][code]var request:URLRequest = new URLRequest(“http://i264.net/lrc.txt”);//这里可以直接读取.lrc文件的,换成自己的字幕地址
var urlloader:URLLoader = new
URLLoader(request);
urlloader.addEventListener(Event.COMPLETE,lrcloaded);
urlloader.load(request); [/code][/font]
[font=宋体]利用[/font]String.split()[font=宋体]将整个字幕分解成若干段:[/font]
[font=宋体][code]function lrcloaded (evt:Event):void{
var
tempArray:Array = evt.target.data.split(“-->”);//可以发现字幕由-->这个来分开的
}[/code][/font]
[font=宋体] [/font]
[font=宋体]定义正则表达式:[/font]
var timeREG:RegExp = /[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]/g;
([font=宋体]关于正则表达式的更多介绍,可以参考孙颖(黑羽)写的《[/font]FlashActionScript[font=宋体]殿堂之路》[/font])
[font=宋体]使用正则表达式:[/font]
tempArray[i].match(timeREG);[/i]//[font=宋体]这里会返回符合正则表达式的字符串[/font]
[font=宋体]实际上不使用正则表达式也是可以做的,[/font]split[font=宋体]分离出来的字符类似这样:[/font]
[font=宋体][code]00:02:35,419
师爷,少爷写的是什么?
5
00:02:35,588[/code][/font]
[font=宋体]表示时间戳的字符串长度固定,在这段字符串前面取12个,后端取12个,也能获取时间戳;[/font]
[font=宋体] [/font]
[font=宋体]把时间戳还原为数字:[/font]
[font=宋体]00:02:35,419[/font]
[font=宋体]显而易见,00表示小时,02表示分钟,35秒钟,419是毫秒了,秒钟*10,分钟*600,以此类推;[/font]
[font=宋体] [/font]
[font=宋体]现在这个方法已经用在在线电影播放里了:[/font]
[url=http://www.i264.net/movie/dz/3517/][font=宋体]http://www.i264.net/movie/dz/3517/[/font][/url]
[font=宋体]当中一些对字幕的控制,其实就是对Textfiled的操作,也很简单。[/font]
[font=宋体] [/font]
[font=宋体]利用NetStream.time(播放头位置,单位:秒)来定位字幕:[/font]
[font=宋体]我想到的方法好像效率不高,就是前面用正则表达式获得并且处理过的时间戳保存在数组里,保存两组,开始时间和结束时间timeStartArray,timeEndArray,用timeStartArra.indexOf(NetStream.time),如果返回不为-1,则显示该时间戳下的字幕内容,timeEndArra.indexOf(NetStream.time),如果返回不为-1,则表示该段字幕显示完毕.[/font]
[font=宋体] [/font]
[font=宋体]MP3[/font][font=宋体]播放器也用类似的方法就可以。[/font]
[[i] 本帖最后由 lynxr 于 2008-10-1 12:10 编辑 [/i]]