解析mp3文件,获得mp3中的专辑图片
这仍然也是操作的是字节,所以其他语言都是适用的。
mp3文件的首尾都存有文件的信息,存在尾部的称为ID3V1,在首部的称为 ID3V2。专辑图片是存放在部的ID3V2。所以这里解析ID3v2
主要的知识点,都是资料中的:
- package service
- {
- //import省略
- public class SoundPlayer
- { private var channel:SoundChannel;//声音通道
- private var sound:Sound;//声音
- private var fileUrl:String;
- private var loader:Loader = new Loader ;
- private var bitmap:Bitmap;
package service {//import省略public class SoundPlayer{ private var channel:SoundChannel;//声音通道private var sound:Sound;//声音private var fileUrl:String;private var loader:Loader = new Loader ;private var bitmap:Bitmap;
- public function SoundPlayer(){}
- //播放音乐的方法
- public function play(url:String):void
- {
- this.fileUrl = url;
- sound = new Sound ;
- sound.load(new URLRequest(url));
- channel = sound.play();
- sound.addEventListener(Event.COMPLETE,soundLoaderComplete);
- }
- //soundLoaderComplete 歌曲加载成功 得到专辑图片
- private function soundLoaderComplete(event:Event):void
- {
- (event.target as Sound).removeEventListener(Event.COMPLETE,soundLoaderComplete);
- var fileStream:FileStream = new FileStream ;
- fileStream.open(new File(this.fileUrl),FileMode.READ);
- //设置文件读取的位置;
- var buffer:ByteArray = new ByteArray ;
- fileStream.readBytes(buffer,0,10);
- var id3Header:ID3V2Header = new ID3V2Header(buffer);
- //去除标签头
- while (true)
- { //读取帧头
- var frameHeaderBuffer:ByteArray = new ByteArray ;
- fileStream.readBytes(frameHeaderBuffer,0,10);
- var id3FrameHeader:ID3V2Frameheader = new ID3V2Frameheader(frameHeaderBuffer);
- if (id3FrameHeader.getFrameSize() <= 0)
- {
- //没有专辑图片
- //删除原来的图片
- loader.unload();
- loader.load(new URLRequest("../images/app.png"));
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE,imageLoaderComplete);
- break;
- }
- //读取帧体
- var frameBodyBuffer:ByteArray = new ByteArray ;
- fileStream.readBytes(frameBodyBuffer,0,id3FrameHeader.getFrameSize());
- //符标识;
- var key:String = id3FrameHeader.getFrameId();
public function SoundPlayer(){}//播放音乐的方法public function play(url:String):void{this.fileUrl = url;sound = new Sound ;sound.load(new URLRequest(url));channel = sound.play();sound.addEventListener(Event.COMPLETE,soundLoaderComplete);}//soundLoaderComplete 歌曲加载成功 得到专辑图片private function soundLoaderComplete(event:Event):void{(event.target as Sound).removeEventListener(Event.COMPLETE,soundLoaderComplete);var fileStream:FileStream = new FileStream ;fileStream.open(new File(this.fileUrl),FileMode.READ);//设置文件读取的位置;var buffer:ByteArray = new ByteArray ;fileStream.readBytes(buffer,0,10);var id3Header:ID3V2Header = new ID3V2Header(buffer);//去除标签头while (true){ //读取帧头var frameHeaderBuffer:ByteArray = new ByteArray ;fileStream.readBytes(frameHeaderBuffer,0,10);var id3FrameHeader:ID3V2Frameheader = new ID3V2Frameheader(frameHeaderBuffer);if (id3FrameHeader.getFrameSize() <= 0){//没有专辑图片//删除原来的图片loader.unload();loader.load(new URLRequest("../images/app.png"));loader.contentLoaderInfo.addEventListener(Event.COMPLETE,imageLoaderComplete);break;}//读取帧体var frameBodyBuffer:ByteArray = new ByteArray ;fileStream.readBytes(frameBodyBuffer,0,id3FrameHeader.getFrameSize());//符标识;var key:String = id3FrameHeader.getFrameId();
- <span style="color: rgb(255, 0, 0);">//专辑图片的符标识是“APIC”</span>
- if (key == "APIC")
- {
- //专辑图片
- var imageBytes:ByteArray = new ByteArray ;
- //前14个字节无用 去除掉
- frameBodyBuffer.position = 14;
- frameBodyBuffer.readBytes(imageBytes,0,frameBodyBuffer.length - 14);
- //删除原来的图片;
- loader.unload();
- loader.loadBytes(imageBytes);
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE,imageLoaderComplete);
- break;
- }
- }
- fileStream.close();
- }
- //专辑图片加载完成
- private function imageLoaderComplete(event:Event):void
- {
- loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,imageLoaderComplete);
//专辑图片的符标识是“APIC”if (key == "APIC"){//专辑图片var imageBytes:ByteArray = new ByteArray ;//前14个字节无用 去除掉frameBodyBuffer.position = 14;frameBodyBuffer.readBytes(imageBytes,0,frameBodyBuffer.length - 14);//删除原来的图片;loader.unload();loader.loadBytes(imageBytes);loader.contentLoaderInfo.addEventListener(Event.COMPLETE,imageLoaderComplete);break;}}fileStream.close();}//专辑图片加载完成private function imageLoaderComplete(event:Event):void{loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,imageLoaderComplete);
- this.bitmap = loader.content as Bitmap;
- }
- }
this.bitmap = loader.content as Bitmap;}}}
ID3V2Header.as
- package service
- {
- import flash.utils.ByteArray;
- public class ID3V2Header
- {
- private var identi:ByteArray = new ByteArray;// ID3标示 3
- private var major:ByteArray = new ByteArray;// 版本号 3 1
- private var revsion:ByteArray = new ByteArray;// 0 1
- private var flags:ByteArray = new ByteArray;// 1
- private var total_size:int;// 标签体大小 4
- public function ID3V2Header(data:ByteArray)
- {
- // constructor code
- data.readBytes(identi,0,3);
- data.readBytes(major,0,1);
- data.readBytes(revsion,0,1);
- data.readBytes(flags,0,1);
- total_size = (data.readByte() & 0x7F) * 0x200000 + (data.readByte() & 0x7F) * 0x400
- + (data.readByte() & 0x7F) * 0x80 + (data.readByte() & 0x7F);
- }
- //返回整个标签体的大小
- public function getTotal_size():int{
- return total_size;
- }
- }
- }
package service {import flash.utils.ByteArray;public class ID3V2Header{private var identi:ByteArray = new ByteArray;// ID3标示 3private var major:ByteArray = new ByteArray;// 版本号 3 1private var revsion:ByteArray = new ByteArray;// 0 1private var flags:ByteArray = new ByteArray;// 1private var total_size:int;// 标签体大小 4public function ID3V2Header(data:ByteArray){// constructor codedata.readBytes(identi,0,3);data.readBytes(major,0,1);data.readBytes(revsion,0,1);data.readBytes(flags,0,1);total_size = (data.readByte() & 0x7F) * 0x200000 + (data.readByte() & 0x7F) * 0x400+ (data.readByte() & 0x7F) * 0x80 + (data.readByte() & 0x7F);}//返回整个标签体的大小public function getTotal_size():int{return total_size;}}}
- package service
- {
- import flash.utils.ByteArray;
- public class ID3V2Frameheader
- {
- private var frameId:ByteArray = new ByteArray;//数据帧标示 4
- private var frameSize:int;//数据帧体大小 4
- private var flags:ByteArray = new ByteArray;//0 2
- public function ID3V2Frameheader(data:ByteArray)
- {
- // constructor code
- data.readBytes(frameId,0,4);
- frameSize = data.readByte()*0x1000000
- +data.readByte()*0x10000
- +data.readByte()*0x100
- +data.readByte();
- data.readBytes(flags,0,2);
- }
- //返回数据帧表示
- public function getFrameId():String{
- return this.frameId.toString();
- }
- //返回这一帧的总共数据大小
- public function getFrameSize():int{
- return this.frameSize;
- }
- }
- }
package service {import flash.utils.ByteArray;public class ID3V2Frameheader{private var frameId:ByteArray = new ByteArray;//数据帧标示 4private var frameSize:int;//数据帧体大小 4private var flags:ByteArray = new ByteArray;//0 2public function ID3V2Frameheader(data:ByteArray){// constructor codedata.readBytes(frameId,0,4);frameSize = data.readByte()*0x1000000+data.readByte()*0x10000+data.readByte()*0x100+data.readByte();data.readBytes(flags,0,2);}//返回数据帧表示public function getFrameId():String{return this.frameId.toString();}//返回这一帧的总共数据大小public function getFrameSize():int{return this.frameSize;}}}
在这里简单说下mp3文件的首部,
1.首先是一个标签头(10个字节), 里面有一个重要的信息是可以通过计算得出标签体的大小
2.然后就是标签体,其中是出若干的帧组成,帧又是由帧头(10个字节),帧体组成(大小不定)
3.帧头中主要有帧标识(APIC,TIT2等等),帧体的大小(可计算大小)
本文转至: http://erziwuyulunbi.iteye.com/blog/1627993
解析mp3文件,获得mp3中的专辑图片相关推荐
- 从MP3中读取专辑图片
好吧,最近帮朋友写毕设时碰到这个的问题的,在网上也是多番查询,都不尽人意,于是自己参考多番之后,写了一个 其实吧,这个读取专辑图片也不是很难得,首先判断MP3文件中是否含有ID3V2的标签,关于ID3 ...
- java mp3 信息_android,java获取MP3文件信息(作者,专辑等)
接着上一篇文章, 上一篇把ndk开发遍历手机文件分享了一下.遍历出来的MP3文件,我需要展示在android的listview里面,想展示的好看一点,结果发现又是一个坑. 根据mp3文件,获取作者啊专 ...
- 医用设备心跳心率检测mp3文件输出(mp3文件处理)(二)
本系统是通过一套国外先进的医用设备将用户心跳心率存储到 mp3文件中, 该软件系统由于日本以非常高的价格出售, 公司决定由我破译硬件数据,开发一套替换日本软件产品. 该项目共花费2个月时间完成. ...
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的.作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了.我做的是一个关于P ...
- android 完美获取音乐文件中的专辑图片并显示
其实实现音乐中的专辑图像提取是相当的容易的,网上大多的资料都是比较扯淡的,其实就几行代码而已. 看下面代码之前,我们所要做的工作是通过mediaplayer已经获取到了音乐文件中的诸多信息: Medi ...
- 获取mp3文件的封面,所属专辑以及以及其他基础信息
使用的工具是ID3 Reader,有兴趣的朋友可以访问以下网址: 官方demo:http://web.ist.utl.pt/antonio.afonso/www.aadsm.net/libraries ...
- java获取专辑封面_从MP3中读取专辑封面图片
首先判断MP3文件中是否含有ID3V2的标签,关于ID3V2的格式有一堆的说法 我嘛,不怎么关心,因此只攻专辑图片,也就是判断是否包含APIC这个标识 找到这个标识其实也就是和解析普通文件一样,每个像 ...
- 关于MP3文件中找不到TAG标签的问题
今天做项目需要上传mp3文件,在postman中测试的时候发现找不到这个mp3文件中的TAG标签 心想着不应该啊,我这是正规音频啊,如果是图片把后缀改成mp3没有TAG是肯定的,但是我这个音频为什么也 ...
- 四、Mp3文件类型及其判断
根据前两篇文章的分析,帧分为标签帧和数据帧,MP3文件类型是根据数据帧的类型来分的,文件类型如下表: 位率相等(Constant BitRate) CBR Mp3文件 位率不等(Variable B ...
最新文章
- 如何使dropship第三方销售是基于发货数量,而不是基于LIV发票校验的数量
- 罗辑思维在全链路压测方面的实践和工作笔记
- 在vi里面实现字符串的批量替换
- swift operation
- OOAD实践之路——真实案例解析OO理论与实践(二、第一项任务:特性列表)
- 工程师如何解决穿衣搭配烦恼?——滴搭平台与算法 1
- .Net水晶报表的使用总结
- Python将浏览器cookies共享给requests库
- linux定时器的实现方法
- JS变量特点及分号用法
- 数据库中delete和drop的区别
- Spark on Hive Hive on Spark傻傻分不清?
- linux中如何压缩目录文件,如何在Linux中压缩和解压缩目录及其文件
- OMV搭建系列教程[6] – 安装AriaNG Web前端
- 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ
- win10设置默认中英文符号
- linux的s权限和t权限
- H5C3进阶——播放器
- 360n4s高通版卡刷包
- DNS知识点及服务搭建案例和解析状态异常