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

AS3读取MP3 ID3
本示例介绍如何使用AS3中的URLStream和ByteArray物件读取MP3文件的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; } } }
### 如何使用 Python 从 MP3 文件中提取或读取内嵌歌词 要实现通过 Python 提取 MP3 文件中的内嵌歌词,可以利用 `mutagen` 库来解析 ID3 标签并获取其中的歌词信息。以下是具体的方法: #### 安装 Mutagen Mutagen 是一个用于处理音频元数据的强大库,支持多种音频格式及其对应的元数据标准。可以通过以下命令安装该库: ```bash pip install mutagen ``` #### 提取歌词代码示例 下面是一个完整的代码片段,展示如何从 MP3 文件中读取歌词信息。 ```python from mutagen.id3 import ID3, USLT def read_lyrics_from_mp3(file_path): try: audio = ID3(file_path) # 查找 USLT 帧 (Unsychronized Lyric Text Information Frame) lyrics_frames = audio.getall(&#39;USLT&#39;) if not lyrics_frames: print("No lyrics found in the file.") return None # 输出找到的第一组歌词 first_frame = lyrics_frames[0] language = first_frame.lang.decode(&#39;utf-8&#39;) # 歌词的语言编码 description = first_frame.desc.decode(&#39;utf-8&#39;) # 描述字段 text = first_frame.text # 实际的歌词文本 print(f"Language: {language}") print(f"Description: {description}") print(f"Lyrics:\n{text}") return text except Exception as e: print(f"Error reading file: {e}") # 调用函数测试 file_path = &#39;example.mp3&#39; # 替换为实际文件路径 read_lyrics_from_mp3(file_path) ``` 上述代码会尝试加载指定 MP3 文件的 ID3 标签,并寻找名为 `USLT` 的帧(这是存储歌词的标准 ID3v2 帧)。如果存在多个 `USLT` 帧,则默认只打印第一个。 #### 关键点说明 1. **ID3 标签结构** 在 ID3v2 中,歌词通常被存放在 `USLT` 帧里[^3]。此帧包含了三个主要部分:语言、描述以及歌词正文。 2. **异常处理** 如果目标 MP3 文件未包含任何歌词或者其 ID3 版本不兼容,则程序可能会抛出错误。因此,在实际应用中建议增加更多的健壮性检查逻辑。 3. **多语言支持** 需要注意的是,某些歌曲可能含有不同语言版本的歌词,这些都会作为独立的 `USLT` 记录保存下来。可以根据需求进一步扩展脚本来遍历所有可用记录。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值