利用AS3来读取MP3的ID3档案资料

本示例介绍如何使用AS3中的URLStream和ByteArray物件读取MP3文件的ID3元数据,并获取文件封面图像。尽管部分文件可能无法正确解析,作者计划增加读写ID3资料的功能。
这个范例是使用在AS3中的URLStream和ByteArray物件来达成的,它可以在网页中去读取目标MP3档案的ID3资料格式,并且可以传回档案的图像,虽然仍是有一些档案是无法正常解读,作者仍计画加入读写ID3资料的功能,到时候应该会更加完善。
源文件下载:
[img]/uploads/allimg/080401/1821270.gif[/img]
[url=http://www2.flash8.net/UploadTeach/2006/01/26/2006126203435912.zip]ID3Example.zip[/url]
[url=http://lab.benstucki.net/archives/ID3Example]
[color="#003399"]范例展示(Flash Player 8.5)[/color]
[/url]
[url=http://blog.benstucki.net/?id=3]
[color="#003399"]原作网页[/color]
[/url]
本文转自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/1755.html
package { import flash.display.Sprite; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.Event; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.utils.ByteArray; import flash.system.System; import flash.net.*; import flash.ui.*; import flash.system.*; public class Main extends Sprite { private var spectrum:Sprite; private var sound:Sound; private var schannel:SoundChannel; private var lrcLoader:URLLoader; private var info_txt:TextField; private var id3_txt:TextField; private var byteArray:ByteArray; private var lrcArray:Array; public function Main() { init(); } //////////////////////////////////////////////////////////////////// ////// 初始化 ////// ////////////////////////////////////////////////////////////////// private function init():void { System.useCodePage = true; Security.allowDomain("*"); sound = new Sound ; sound.load(new URLRequest("醉酒歌.mp3")); schannel = sound.play(); ////////////////////////////////////////////////// lrcLoader = new URLLoader ; lrcLoader.load(new URLRequest("《醉酒歌》.lrc")); /////////////////////////////////////////////////; info_txt = new TextField ; info_txt.height = 20; info_txt.y = 100; info_txt.selectable = false; info_txt.background = true; info_txt.backgroundColor = 0xFF9900; info_txt.defaultTextFormat = getFormat(); this.addChild(info_txt); id3_txt = new TextField ; id3_txt.width = 300; id3_txt.selectable = false; id3_txt.defaultTextFormat = getFormat(); this.addChild(id3_txt); /////////////////////////////////////////////////; spectrum = new Sprite ; spectrum.x = 10; spectrum.y = 250; this.addChild(spectrum); ////////////////////////////////////////////////; byteArray = new ByteArray ; lrcArray = new Array ; addEvents(); } //////////////////////////////////////////////////////////////////// ////// 设置文本格式 ////// ////////////////////////////////////////////////////////////////// private function getFormat():TextFormat { var textFmt:TextFormat = new TextFormat ; textFmt.align = TextFieldAutoSize.LEFT; textFmt.font = "Arial"; textFmt.color = 0x000000; textFmt.size = 14; return textFmt; } //////////////////////////////////////////////////////////////////// ////// 添加事件 ////// ////////////////////////////////////////////////////////////////// private function addEvents():void { sound.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler); sound.addEventListener(Event.ID3,id3InfoHandler); lrcLoader.addEventListener(Event.COMPLETE,loadCompleteHandler); stage.addEventListener(Event.ENTER_FRAME,soundPlayingHandler); this.addEventListener(Event.ENTER_FRAME,creatSpectrum); } private function soundCompleteHandler(event:Event):void { stage.removeEventListener(Event.ENTER_FRAME,soundPlayingHandler); this.removeEventListener(Event.ENTER_FRAME,creatSpectrum); } private function id3InfoHandler(event:Event):void { var tar:Sound = event.target as Sound; id3_txt.text = "歌名:" + tar.id3.songName + "\n" + "歌手:" + tar.id3.artist + "\n" + "专辑:" + tar.id3.album; } //////////////////////////////////////////////////////////////////// ////// 读取歌词信息 ////// ////////////////////////////////////////////////////////////////// private function loadCompleteHandler(event:Event):void { var lrclist:String = event.target.data; var lrcArr:Array = lrclist.split("\n"); var reg:RegExp = /\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g; for (var i:int = 0; i < lrcArr.length; i++) { var lrcStr:String = lrcArr[i]; var len:int = lrcStr.match(reg).length; var timeArr:Array = lrcStr.match(reg); var lyrics:String = lrcStr.substr((len * 10)); for (var t:int = 0; t < timeArr.length; t++) { var timeS:String = timeArr[t]; var timeN:Number = (((Number(timeS.substr(1,2)) * 60) + Number(timeS.substr(4,5))) * 1000); var object:Object = new Object ; object.timer = timeN; object.lrc = lyrics; lrcArray.push(object); } } lrcArray.sort(compare); } ////////////////////////////////////////////////////////////////////; ////// 歌词歌曲同步 ////// /////////////////////////////////////////////////////////////////// private function soundPlayingHandler(event:Event):void { for (var i:int = 1; i < lrcArray.length; i++) { if (schannel.position < lrcArray[i].timer) { info_txt.text = "歌词:" + lrcArray[i - 1].lrc; break; } info_txt.text = "end:" + lrcArray[lrcArray.length - 1].lrc; } info_txt.width = info_txt.textWidth + 5; } //////////////////////////////////////////////////////////////////// ////// 创建频谱 ////// /////////////////////////////////////////////////////////////////// private function creatSpectrum(event:Event):void { SoundMixer.computeSpectrum(byteArray,true); spectrum.graphics.clear(); spectrum.graphics.lineStyle(0,0x666666); spectrum.graphics.beginFill(0x666666); spectrum.graphics.moveTo(0,0); for (var i:int = 0; i < 256; i += 5) { var n:Number = byteArray.readFloat() * 100; spectrum.graphics.drawRect(i,0,3, - n); } } ////////////////////////////////////////////////////////////////////; ////// 比较函数 ////// /////////////////////////////////////////////////////////////////// private function compare(pareA:Object,pareB:Object):int { if (pareA.timer > pareB.timer) { return 1; } if (pareA.timer < pareB.timer) { return -1; } return 0; } } }
采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值