以下是常见音频文件格式的特点。
  要在计算机内播放或是处理音频文件,也就是要对声音文件进行数、模转换,这个过程同样由采样和量化构成,人耳所能听到的声音,最低的频率是从20Hz起一直到最高频率20KHZ,20KHz以上人耳是听不到的,因此音频的最大带宽是20KHZ,故而采样速率需要介于40~50KHZ之间,而且对每个样本需要更多的量化比特数。音频数字化的标准是每个样本16位-96dB的信噪比,采用线性脉冲编码调制PCM,每一量化步长都具有相等的长度。在音频文件的制作中,正是采用这一标准。
CD格式:正统血脉
  当今世界上音质最好的音频格式是什么?当然是CD了。因此要讲音频格式,CD自然是打头阵的先锋。在大多数播放软件的“打开文件类型”中,都可以看到*.cda格式,这就是CD音轨了。标准CD格式也就是44.1K的采样频率,速率88K/秒,16位量化位数,因为CD音轨可以说是近似无损的,因此它的声音基本上是忠于原声的,因此如果你如果是一个音响发烧友的话,CD是你的首选。它会让你感受到天籁之音。CD光盘可以在CD唱机中播放,也能用电脑里的各种播放软件来重放。一个CD音频文件是一个*.cda文件,这只是一个索引信息,并不是真正的包含声音信息,所以不论CD音乐的长短,在电脑上看到的“*.cda文件”都是44字节长。注意:不能直接的复制CD格式的*.cda文件到硬盘上播放,需要使用象EAC这样的抓音轨软件把CD格式的文件转换成WAV,这个转换过程如果光盘驱动器质量过关而且EAC的参数设置得当的话,可以说是基本上无损抓音频。推荐大家使用这种方法。
WAV:无损
  是微软公司开发的一种声音文件格式,它符合 PIFFResource Interchange File Format 文件规范,用于保存WINDOWS平台的音频信息资源,被WINDOWS平台及其应用程序所支持。“*.WAV”格式支持MSADPCM、CCITT A LAW等多种压缩算法,支持多种音频位数、采样频率和声道,标准格式的WAV文件和CD格式一样,也是44.1K的采样频率,速率88K/秒,16位量化位数,看到了吧,WAV格式的声音文件质量和CD相差无几,也是目前PC机上广为流行的声音文件格式,几乎所有的音频编辑软件都“认识”WAV格式。 但缺点是体型过于“巨大”。
AIFF与AU
  这里顺便提一下由苹果公司开发的AIFF(Audio Interchange File Format)格式和为UNIX系统开发的AU格式,它们都和WAV非常相像,在大多数的音频编辑软件中也都支持它们这几种常见的音乐格式。
MP3:流行
  MP3格式诞生于八十年代的德国,所谓的MP3也就是指的是MPEG标准中的音频部分,也就是MPEG音频层。根据压缩质量和编码处理的不同分为3层,分别对应“*.mp1"/“*.mp2”/“*.mp3”这3种声音文件。需要提醒大家注意的地方是:MPEG音频文件的压缩是一种有损压缩,MPEG3音频编码具有10:1~12:1的高压缩率,同时基本保持低音频部分不失真,但是牺牲了声音文件中12KHz到16KHz高音频这部分的质量来换取文件的尺寸,相同长度的音乐文件,用*.mp3格式来储存,一般只有*.wav文件的1/10,而音质要次于CD格式或WAV格式的声音文件。由于其文件尺寸小,音质好;所以在它问世之初还没有什么别的音频格式可以与之匹敌,因而为*.mp3格式的发展提供了良好的条件。直到现在,这种格式还是风靡一时,作为主流音频格式的地位难以被撼动。但是树大招风,MP3音乐的版权问题也一直是找不到办法解决,因为MP3没有版权保护技术,说白了也就是谁都可以用。
  MP3格式压缩音乐的采样频率有很多种,可以用64Kbps或更低的采样频率节省空间,也可以用320Kbps的标准达到极高的音质。我们用装有Fraunhofer IIS Mpeg Lyaer3的 MP3编码器(现在效果最好的编码器)MusicMatch Jukebox 6.0在128Kbps的频率下编码一首3分钟的歌曲,得到2.82MB的MP3文件。采用缺省的CBR(固定采样频率)技术可以以固定的频率采样一首歌曲,而VBR(可变采样频率)则可以在音乐“忙”的时候加大采样的频率获取更高的音质,不过产生的MP3文件可能在某些播放器上无法播放。我们把VBR的级别设定成为与前面的CBR文件的音质基本一样,生成的VBR MP3文件为2.9MB。
MIDI:作曲家最爱
  经常玩音乐的人应该常听到MIDI(Musical Instrument Digital Interface)这个词,MIDI允许数字合成器和其他设备交换数据。MID文件格式由MIDI继承而来。MID文件并不是一段录制好的声音,而是记录声音的信息,然后在告诉声卡如何再现音乐的一组指令。这样一个MIDI文件每存1分钟的音乐只用大约5~10KB。今天,MID文件主要用于原始乐器作品,流行歌曲的业余表演,游戏音轨以及电子贺卡等。*.mid文件重放的效果完全依赖声卡的档次。*.mid格式的最大用处是在电脑作曲领域。*.mid文件可以用作曲软件写出,也可以通过声卡的MIDI口把外接音序器演奏的乐曲输入电脑里,制成*.mid文件。
WMA:最具实力
  WMA (Windows Media Audio) 格式是来自于微软的重量级选手,后台强硬,音质要强于MP3格式,更远胜于RA格式,它和日本YAMAHA公司开发的VQF格式一样,是以减少数据流量但保持音质的方法来达到比MP3压缩率更高的目的,WMA的压缩率一般都可以达到1:18左右,WMA的另一个优点是内容提供商可以通过DRM(Digital Rights Management)方案如Windows Media Rights Manager 7加入防拷贝保护。这种内置了版权保护技术可以限制播放时间和播放次数甚至于播放的机器等等,这对被盗版搅得焦头乱额的音乐公司来说可是一个福音,另外WMA还支持音频流(Stream)技术,适合在网络上在线播放,作为微软抢占网络音乐的开路先锋可以说是技术领先、风头强劲,更方便的是不用象MP3那样需要安装额外的播放器,而Windows操作系统和Windows Media Player的无缝捆绑让你只要安装了windows操作系统就可以直接播放WMA音乐,新版本的Windows Media Player7.0更是增加了直接把CD光盘转换为WMA声音格式的功能,在新出品的操作系统Windows XP中,WMA是默认的编码格式,大家知道Netscape的遭遇,现在“狼”又来了。WMA这种格式在录制时可以对音质进行调节。同一格式,音质好的可与CD媲美,压缩率较高的可用于网络广播。虽然现在网络上还不是很流行,但是在微软的大规模推广下已经是得到了越来越多站点的承认和大力支持,在网络音乐领域中直逼*.mp3,在网络广播方面,也正在瓜分Real打下的天下。因此,几乎所有的音频格式都感受到了WMA格式的压力。
  时下的MP3支持格式最常见的是MP3和WMA。MP3由于是有损压缩,因此讲求采样率,一般是44.1KHZ。另外,还有比特率,即数据流,一般为8---320KBPS。在MP3编码时,还看看它是否支持可变比特率(VBR),现在出的MP3机大部分都支持,这样可以减小有效文件的体积。WMA则是微软力推的一种音频格式,相对来说要比MP3体积更小。
RealAudio:流动旋律
  RealAudio主要适用于在网络上的在线音乐欣赏,现在大多数的用户仍然在使用56Kbps或更低速率的Modem,所以典型的回放并非最好的音质。有的下载站点会提示你根据你的Modem速率选择最佳的Real文件。现在real的的文件格式主要有这么几种:有RA(RealAudio)、RM(RealMedia,RealAudio G2)、RMX(RealAudio Secured),还有更多。这些格式的特点是可以随网络带宽的不同而改变声音的质量,在保证大多数人听到流畅声音的前提下,令带宽较富裕的听众获得较好的音质。
  近来随着网络带宽的普遍改善,Real公司正推出用于网络广播的、达到CD音质的格式。如果你的RealPlayer软件不能处理这种格式,它就会提醒你下载一个免费的升级包。
VQF:无人问津
  VQF是 雅马哈公司开发的一种格式是,它的核心是减少数据流量但保持音质的方法来达到更高的压缩比,可以说技术上也是很先进的,但是由于宣传不力,这种格式难有用武之地。*.vqf可以用雅马哈的播放器播放。同时雅马哈也提供从*.wav文件转换到*.vqf文件的软件。 此文件缺少特点外加缺乏宣传,现在几乎已经宣布死刑了。
OGG:新生代音频格式
  Ogg全称应该是OGG Vobis(ogg Vorbis) 是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vobis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。
  Vorbis 是这种音频压缩机制的名字,而Ogg则是一个计划的名字,该计划意图设计一个完全开放性的多媒体系统。目前该计划只实现了OggVorbis这一部分。
  Ogg Vorbis文件的扩展名是.OGG。这种文件的设计格式是非常先进的。现在创建的OGG文件可以在未来的任何播放器上播放,因此,这种文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。
  ogg格式完全开源,完全免费, 和mp3不相上下的新格式。
AAC: 前途无量
  AAC(高级音频编码技术 Advanced Audio Coding),是杜比实验室为音乐提供的技术,最大能容纳48通道的音轨,采样率达96 KHz。出现于1997年,是基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比、苹果、AT&T、索尼等公司共同开发,以取代mp3格式。2000年,MPEG-4标准出台,AAC从新整合了其特性,故现又称MPEG-4 AAC,即m4a。
  AAC作为一种高压缩比的音频压缩算法,AAC通常压缩比为18:1,也有资料说为20:1,远远超过了AC-3、MP3等较老的音频压缩算法。一般认为,AAC格式在96Kbps码率的表现超过了128Kbps的MP3音频。AAC另一个引人注目的地方就是它的多声道特性,它支持1~48个全音域音轨和15个低频音轨。除此之外,AAC最高支持96KHz的采样率,其解析能力足可以和DVD-Audio的PCM编码相提并论,因此,它得到了DVD论坛的支持,成为了下一代DVD的标准音频编码。
APE 无损压缩格式
  新一代的无损音频格式。 APE的本质,其实它是一种无损压缩音频格式。庞大的WAV音频文件可以通过Monkey''s Audio这个软件进行“瘦身”压缩为APE。很时候它被用做网络音频文件传输,因为被压缩后的APE文件容量要比WAV源文件小一半多,可以节约传输所用的时间。更重要的是,通过Monkey's Audio解压缩还原以后得到的WAV文件可以做到与压缩前的源文件完全一致。所以APE被誉为“无损音频压缩格式”,Monkey''s Audio被誉为“无损音频压缩软件”。
  FLAC格式
  非常成熟的无损压缩格式,名气不在APE之下!FLAC是FreeLosslessAudioCodec的简称,该格式的源码完全开放,而且兼容几乎所有的操作系统平台。它的编码算法相当成熟,已经通过了严格的测试,而且据说在文件点损坏的情况下依然能够正常播放(这一点我不曾试过)。该格式不仅有成熟的Windows制作程序,还得到了众多第三方软件的支持。此外该格式是唯一的已经得到硬件支持的无损格式,Rio公司的硬盘随身听Karma,建伍的车载音响MusicKeg以及PhatBox公司的数码播放机都能支持FLAC格式。
  Tom's Audio Kompressor(TAK格式)
  TAK是一种新型的无损音频压缩格式,全称是Tom's Audio Kompressor,产于德国。目前最新版本还停留在1.01(2007年06月02日)。它类似于FLAC和APE,总体来说,压缩率类似APE而且解压缩速度类似FLAC,算是综合了两者的优点。另外,用此格式的编码器压缩的音频是VBR,即可变比特率的。
  几大特点:
  -较为优秀的压缩率。使用Extra参数的压缩率类似APE的High参数,而使用TAK最快的压缩参数Turbo得到的结果和FLAC压缩率最大的参数效果有得一比。
  -较快的压缩速度。作者说在相同压缩率的情况下,据他了解尚未有别的格式能够比TAK的Turbo和Fast的参数压缩得更快。
  -非常快的解压速度。类似于FLAC的解压速度。
  -支持很多常用音频格式转换为TAK。
  -流支持。每隔两秒,包含解码所需全部信息的一桢会被插入到音频中。
  -容错度。1比特的信息出错,最多影响到250毫秒的音频。由于有上文提到的技术支持,利用本格式压缩的损坏严重的音频也可照样播放,代价是损坏的部分由静音代替。
  -错误校验。24比特的CRC校验用于每一桢上。
  -简单快速的查找能力。即在你需要从中间某一点播放的时候,能够很快地找到你想要的地方开始播放,定位也十分准确。
  -支持音频信息。同时支持利用外挂CUE分割音轨和添加音频信息。类似APE等。
评论
  作为数字音乐文件格式的标准, WAV 格式容量过大,因而使用起来很不方便。因此,一般情况下我们把它压缩为MP3或 WMA 格式。压缩方法有无损压缩,有损压缩,以及混成压缩。MPEG, JPEG就属于混成压缩,如果把压缩的数据还原回去,数据其实是不一样的。当然,人耳是无法分辨的。因此,如果把 MP3, OGG格式从压缩的状态还原回去的话,就会产生损失。然而, APE 格式即使还原,也能毫无损失地保留原有音质。所以, APE可以无损失高音质地压缩和还原。在完全保持音质的前提下,APE的压缩容量有了适当的减小。拿一个最为常见的38MB WAV文件为例,压缩为 APE 格式后为25MB 左右,比开始足足少了13MB。而且MP3容量越来越大的今天,25M的歌曲已经算不上什么庞然大物了。以1GB的mp3来说可以放入4张CD,那就是40多首歌曲,已经足够了!
posted @ 2009-01-19 13:01 小马歌 阅读(470) | 评论 (0)编辑 收藏
 

MP3,MP4的视频功能从出现到今天,算起来也有三,四年时间了,但是现在的视频播放能力上,除了显示屏越来越大,分辨率,色度越来越高之外,并没有什么太大的转变,视频编码换了不少,但想要在随身播放器上播放视频,绝大多数还是需要转换,而这正是消费者最头疼的事。并且MP4播放器类产品与PSP等还有所不同,各家品牌之间的MP4产品并不能同一编码和格式,因此不能像PSP那样有一个提供大家共享的资源社区,大多数时候消费者还是需要自行转换格式,而一般二次压缩之后的视频文件或多或少的存在显示缺陷,并且浪费了大量的转换时间。因此一种易获得,资源多的视频格式支持便成为了消费者最迫切的需求。而RM/RMVB格式正好满足了这一需要。随着几款低价RM/RMVB格式直接支持的MP4播放器的上市,RMVB在网络盛行之后,又成为了随身播放领域炙手可热的话题。在此,我们不妨就一起来看看什么是RMVB格式,RMVB格式又有那些优势?

早期的Realplayer Pluse播放器

RMVB源自于Real Network公司的RealMedia(RM)格式,该公司是拥有悠久历史,在网络媒体上具有强大的技术力量。RealMedia普遍的特点是体积小,能够适应非常窄的网络带宽,RMVB是原有的RM格式的改进,从RM9开始支持VBR编码模式,并且改进了编码算法,使其具有更高的要缩率和品质。它的推出在一定程度上弥补了一些原有的缺憾。相对于随身领域而言,RMVB格式最大的优势莫过于动态比特率,“雾化”技术和无须转换这三点了。

现在的RealOne Player

区别与之前的RM格式,RMVB最大的特色就是加入了VBR技术,也就是Variable Bit Rate(可改变之比特率)的英文缩写。VBR编码是多媒体文件广泛使用的编码方式,例如常见的Mp3、wma、mpeg1、2、4都支持VBR编码模式!以往我们在播放常见的RM格式电影时,可以在某些播放器看到“xxxKbps”字样,这就是比特率。影片的静止画面和运动画面对压缩采样率的要求是不同的,如果始终保持固定的比特率,会对比特利用造成浪费。 RMVB打破了原先RM格式那种平均压缩采样的方式,在保证平均压缩比的基础上,编码器会根据画面变化的复杂程度设定动态的不同的位率,最高位率一般为平均平均位率两倍的最大位率。将较高的比特率用于复杂的动态画面(歌舞、飞车、战争等),而在静态画面中则灵活地转为较低的采样率,合理地利用了比特率资源,使得在牺牲少部分影片质量情况下最大限度地压缩了影片的大小,最终拥有了和固定比特率编码的文件相近的视听效果,可谓体积与清晰度“鱼与熊掌兼得”。

除了动态比特率外,RMVB格式与传统视频格式另一个最大的区别就在于:压缩文件时RMVB采用的特殊的“雾化”技术,而不是传统丢帧的方式。从平时的使用中,我们就可以看出来,一般播放RMVB格式的文件,在放大到一定程度或者全屏时,画面会显得模糊,而不是出现“马赛克”现象。这就是RMVB格式的优势。在很低的位率下,画面会显得很朦胧,但不会出现色块。而位率超过700kbps之后其画质开始步入DVDRip!因此RMVB可以在非常低的位率实现相当好的效果。

就目前的市场来看,歌美X750,艾诺V2000等几款产品,都采用了主频达到500MHz的ADI Blackfin 533处理器,这样一来网络上超过85%的RMVB文件都可以直接在MP4播放器上直接播放了。而我们从网上下载的绝大多数RMVB电影显示都超过了480P,而这个在电脑上播放的分辨率换到屏幕尺寸相对较小的MP4播放器时,清晰度就大大提高了,换句话说,由于没有进行二次的转换压缩,配合RMVB格式本身特殊“雾化”技术和动态比特率两个优势,实现了另一种形式的“高清”!在随身播放器容量不断增大的今天,我们可以轻松的播放器中拷入多部电影。而无须转换,直接播放,并且比以往任何一种二次压缩的视频格式更加清晰,流畅!这就是直接支持RMVB格式播放器相对于现有视频播放器最大的优势所在!

posted @ 2009-01-19 12:10 小马歌 阅读(290) | 评论 (0)编辑 收藏
 
一,介绍:

如果要想迅速的得到 Linux 环境中的日志报告信息, Logwatch 是一个很好的工具。一般的 Linux 系统中可能都默认安装了这个工具.几乎不需要额外的配置就可以简单的用起来。

# logwatch --print

这条命令将会把昨天的日志信息简要的打印出来. 比如用户登录失败信息、SSH 登录信息、磁盘空间使用等。

单独查看某个服务,比如 SSH 登录信息:

# logwatch --service sshd --print

这条命令可以查看使用说明:

# logwatch --help

最新版本的 LogWatch 默认有 70 多种 Log 的配置信息. 如果要对自己的特殊 Log 做监控, 定制也是比较容易的。简单记录一下:

基本的做法:

1) 创建一个日志文件组。指定自己的 Log 文件,可以是一个,可以是多个;

2) 创建一个新的服务。指明这个服务的名字, 指明 Log 文件来源(来自上一步的定义);

3) 创建一个过滤脚本。

整个原理就是,LogWatch 首先要知道针对哪一个服务, 从这个服务中得到需要处理的 Log 文件信息, 然后这个文件送给过滤脚本处理, 之后把处理后格式化的信息展现出来。出于时间关系,例子就不给了。

但是每天ssh到服务器上使用太不方便,还好logwatch提供了mail功能:

#nano /etc/logwatch/conf/logwatch.conf

修改下面的root为你自己的邮件地址:

MailTo = root(其实可以加自己的邮箱,中间逗号隔开)

同时,因为我们需要了解服务器的详细信息,所以,修改下面的:

Detail = 是细节度,推荐 10 ,即最高

安全:

LogWatch 旧版本 2.11 有个著名的漏洞:临时目录建立处理中存在竞争条件漏洞。这里有溢出代码:Root Compromise through LogWatch

其他: LogWatch 报告的是 Log 信息的历史数据,如果要实时监控 Log,可以考虑用 Swatch。

二,安装配置

Logwatch能够对Linux 环境系统Log报告进行分析,自动发送电子邮件给系统管理员,而且能够根据用户的需求进行定制。
1、下载最新版
Logwatch的官方网站地址:http://www.logwatch.org/
下载地址:wget ftp://ftp.kaybee.org/pub/redhat/RPMS/noarch/logwatch-6.0.2-2.noarch.rpm

2、查看是否安装软件包
# rpm -q logwatch
logwatch-4.3.1-2
# rpm -q perl
perl-5.8.0-88
3、设置
logwatch日志分析软件需要借助系统自带的MTA发邮件,所以系统需要安装比如sendmail,postfix等邮件程序,只要安装完sendmail,使用默认设置就可以发邮件了。
4、配置文件:
/etc/log.d/logwatch.conf
修改以下内容为这样:
MailTo = root@a.com 管理员的邮箱地址
Detail = High 是细节度,推荐 10(或high) ,即日志详细程度为高

5、重启sendmail
# /etc/init.d/sendmail start

6、执行logwatch:
自动执行:
logwatch默认为每天执行一次(cron.daily)。
手动执行:
# perl /usr/sbin/logwatch

#perl /etc/log.d/scripts/logwatch.pl

7、查看邮件日志
/var/log/mail/log

posted @ 2009-01-15 10:44 小马歌 阅读(832) | 评论 (0)编辑 收藏
 

有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行

long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,我生成的log就在mysql的data目录
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。

把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境。

接下来就是分析了,我这里的文件名字叫host-slow.log。
先mysqldumpslow –help以下,俺主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string

-s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log

上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。

用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。

posted @ 2009-01-12 14:49 小马歌 阅读(130) | 评论 (0)编辑 收藏
 

1, MP3简介

MP3是今天一种常见的音乐格式,但恐怕除了工作要求之外,有兴趣对此进行研究的人恐怕不多。所以,当我打算做MP3解码方面的工作时,在找资料时也颇费了一番周折,同时也觉得很有趣。所以想在这里分享一下自己的心得,做一个总结性的介绍。这样有兴趣的同志也可以对此有一个大概了解,尽快入门。

MP3
MPEG-1 Audio Layer 3的简称,是当今比较流行的一种数字音频编码和有损压缩格式(有Layer 3,也必然有Layer1Layer2,也就是MP1MP2,但不在本文讨论范围之内)。MP3技术的应该可以用来大幅度的降低音频文件存储所需要的空间。它丢掉脉冲编码调制(PCM)音频数据中对人类听觉不重要得数据,从而达到了较高的压缩比(高达121101)。简单地说,MP3在编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成有较高压缩比的MP3文件,并使压缩后的文件在回放时也能够达到比较接近原音源的效果。

MP3
的音频质量取决于它的BitrateSampling frequency,以及编码器质量。MP3的典型速度介于每秒128320kb之间。采样频率也有44.14832 kHz三种频率,比较常见的是采用CD采样频率——44.1kHz。常用的编码器是LAME,它完全遵循LGPLMP3编码器,有着良好的速度和音质。

 

2,      MP3文件格式

用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有规律可循的。

MP3
文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。

I, ID3V2

ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

标签头

长度为10个字节,位于文件首部,其数据结构如下:

char Header[3]; /* 字符串 "ID3" */

char Ver;       /* 版本号ID3V2.3 就记录3 */

char Revision; /* 副版本号此版本记录为0 */

char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */

char Size[4]; /* 标签大小,除了标签头的10 个字节的标签帧的大小 */

标签大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

计算公式如下:

ID3V2_frame_size = (int)(Size[0] & 0x7F) << 21
                 | (int)(Size[1] & 0x7F) << 14
                  | (int)(Size[2] & 0x7F) << 7
                  | (int)(Size[3] & 0x7F) + 10;


标签帧

每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下:

char FrameID[4];   /*用四个字符标识一个帧,说明其内容 */

char Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */

char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */

常用帧标识:

TIT2:标题
TPE1
:作者
TALB
:专辑
TRCK
: 音轨,格式:N/MN表示专辑中第几首,M为专辑中歌曲总数
TYER
:年份
TCON
:类型
COMM
:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言
帧大小为四个字节所表示的整数大小。


II, ID3V1

其数据结构如下:

char Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */
char Title[30];    /*
标题 */
char Artist[30];   /*
作者 */
char Album[30];    /*
专集 */
char Year[4];      /*
出品年代 */
char Comment[28]; /*
备注 */
char reserve;      /*
保留 */
char track;;       /*
音轨 */
char Genre;        /*
类型 */

其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.

有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。


III,
数据帧

数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。

A,帧头结构如下:

位置     长度     描述
BIT  BITS
————————————————————————————
31
19   12       Frame sync(0xFFF)
18/17    2        Layer, 00 – reserved, 01 – Layer III
                         10 – Layer II, 11
Layer I
16       1         protection_bit, 0
意味着受CRC保护,帧头后面跟16位的CRC
15-12    4        bitrate_index,
比特率
11-10    2        sampling_frequency,    00 – 44.1KHz, 01 – 48KHz
                                         10 – 32 KHz,  11 –
保留
9        1        padding_bit,1
意味着帧里包含padding位,仅当采样频率为44.1KHz时发生。
8        1        private_bit
7
6     2        mode,    00stereo,        01-joint stereo(intensity stereo and/or ms_stereo)
                           
11- dual_channel, 11 – single_channel
5-4      2        mode_extension,
Layer III中表示使用了哪一种joint stereo编码方式。
                            Intensity_stereo   ms_stereo
                   00            off                off
                   01            on                 off
                   10            off                on
                   11            on                 on
3        1        copyright,1
表示受版权保护。
2        1        original
0表示该bitstream是一个copy1表示是original.
1-0      2        emphasis
,表示会使用哪一种de-emphasis
                   00
no emphasis,     01 – 50/15 microsec. Emphasis
                   
10 – reserved,        11 – CCITT J.17

1)      无论帧长是多少,每帧的播放时间都是26ms

2)      数据帧大小:

FrameSize = 144 * Bitrate / SamplingRate + PaddingBit
144 * Bitrate / SamplingRate不能被8整除,则加上相应的paddingBit.

B,MAIN_DATA:

MP3granule包含18 * 32subband采样。每个数据帧含有两个granule的数据,其内容结如下:
       - main_data_end pointer
       - side info for both granules (scfsi)
       - side info granule 1
       - side info granule 2
       - scalefactors and Huffman code data granule 1
       - scalefactors and Huffman code data granule 2

主要数据里包含了scalefactors, Huffman encoded dataancillary information。其内容不再详叙,可以参考MP3 SPECIS0 11172-3 AUDIO PART。我们一般用的都是立体声,scfsi的长度为32个字节。

这里要解释的一个概念就是位流――bitstream。我们平常接触到的数据都是整数,最小的单位就是byte后者char。虽然我们也会用一个字节里的不同位来表示不同的含义,但总的来说,我们在出来数据的时候还是把它当作一个个字节看待。但对MP3这种数据格式来说,这是行不通的。在解码时,它的数据输入就是一个个比特流。其中一个或几个比特会是你的采样数据或者信息编码。你需要从整个MAIN_DATA里提取你所需要的以BIT为单位的参数和输入信号,从而进行解码。所以我们需要一个子程序,getbit(n),也就是从缓冲中提取所需要的位,并形成一个新的整数,作为我们的输出。

C,LAME标签帧

可是,当你真的打开一个MP3文件的时候,你会发现,很奇怪,很多时候第一个数据帧的帧头后面的32个字节居然都为0,这是为什么呢,这么奇怪的解码信息该如何解释?找到MP3 INFO TAG REV SPECIFICATION的网站,我才明白,原来第一帧并不是真正的数据帧,而是LAME编码的标志帧。

这里又要牵涉到两个概念:CBRVBRCBR表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。VBRVariable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,它以字符串“Xing”为标记。同时,它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。

在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。接下来一直到该帧结束就是Zone CLAME标签。

3,      相关资料

× Mp3 Info Tag rev 1 specifications - draft 0

× MP3 文件格式

× MP3 SPECIS0 11172-3 AUDIO PART

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1688758

posted @ 2008-12-29 15:36 小马歌 阅读(535) | 评论 (0)编辑 收藏
 
1,nice  调节命令执行优先级
        功能说明:设置优先权。
  语  法:nice [-n <优先等级>][--help][--version][执行指令]
  补充说明:nice指令可以改变程序执行的优先权等级。
  参  数:  -n<优先等级>或-<优先等级>或--adjustment=<优先等级>  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
  --help  在线帮助。
  --version  显示版本信息。
2, rpm   rpm包管理
rpm -qa 查询系统所安装的所有rpm包
rpm -e [package] 卸载rpm包
rpm -ivh [package]  安装rpm包
posted @ 2008-12-27 15:59 小马歌 阅读(74) | 评论 (0)编辑 收藏
 

MySql的备份可用命令mysqldump ,使用方法很简单,mysqldump -u 用户名 -p (密码) -h 主机名 数据库名 >路径/备份名.bak;同时也可以是用mysqldump到处数据结构(tablename.sql)和数据(tablename.txt) mysqldump -u 用户名  -p (密码)  -h 主机名 数据库名 tablename1 tablename2 > back.sql或mysqldump -u 用户名 -p (密码) -h 主机名 数据库名 --tab 路径 --opt 数据库名.
EXA:
mysqldump -u pivot -p pivot news > c:\news.sql


   那么还原可以mysql命令,mysql -u 用户名 -p (密码) -h 主机名 --one-database 还原数据库名 < 路径/备份名.bak,--one-database是指定要恢复的数据库.
EXA:
mysql -u pivot -p pivot news < c:\news.sql

  (括号表示密码不先输入,在连接时在Enter password;若密码为空可缺省-p参数)

posted @ 2008-12-26 10:42 小马歌 阅读(191) | 评论 (0)编辑 收藏
 

在Java编程中,可以用URLConnection(HttpURLConnection)获取web资源 
                  
String originalurl = "http://www.google.com";
URL url = new URL(originalurl);
URLConnection urlCon = url.openConnection();
(或HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();)

在使用上面语句进行http链接,如果没有超时设置,当在网络异常时经常会出现程序僵死的情况。
这种情况在用浏览器请求web页面时也可能出现,即某一页面一直处于下载状态,无法获得数据也无报错。
通过使用下面的语句进行超时设置即可解决这一问题。

System.setProperty("sun.net.client.defaultConnectTimeout", "60000");
System.setProperty("sun.net.client.defaultReadTimeout", "60000");

//设置连接主机的超时时间和从主机读取数据的超时时间均为1分钟(60000毫秒)。
JDk 1.4及以前的版本可以用上面方法,在以后版本中有更简单的方法,如下:

urlCon.setConnectTimeout(60000);
urlCon.setReadTimeout(60000);

文章出处:http://www.diybl.com/course/3_program/java/javajs/20071018/77938.html

posted @ 2008-12-26 10:41 小马歌 阅读(377) | 评论 (0)编辑 收藏
 
     摘要: 1.判断select选项中 是否存在Value="paraValue"的Item 2.向select选项中 加入一个Item 3.从select选项中 删除一个Item 4.修改select选项中 value="paraValue"的text为"paraText" 5.设置select中text="paraText"的第一个Item为选中 6.设置select中value="paraVa...  阅读全文
posted @ 2008-12-26 10:39 小马歌 阅读(3737) | 评论 (0)编辑 收藏
 

*
     功能说明:分析字符串s,提取s里面的超链接和链接文字.并存入动态数组
     同时根据指定包含和不包含的字符串进行过滤相关链接。
     2008年3月30日
     
*/

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
public class RegTest
...{
    public static void main(String[] args)
    ...{

        //定义一个文章列表类。包含文章的网址和文章标题
        class ArticleList
        ...{
            String URLs;
            String title;

            public ArticleList()...{}
            public ArticleList(String t,String u)
            ...{
                title=t;
                URLs=u;
            }
                   
            public String toString()
            ...{
                return ("标题:"+title+" 网址:"+URLs+" ");
            }
        }
    
        ArrayList <ArticleList>  al=new ArrayList<ArticleList>();
        String s="</p><p style=height:14px><a href=http://jingjia.baidu.com>企业推广</a> | <a href=http://top.baidu.com>搜索风云榜</a> | <a href=/home.html>关于百度</a> | <a href=http://ir.baidu.com>About Baidu</a></p><p id=b>&copy;2008 Baidu <a href=http://www.baidu.com/duty>使用百度前必读</a> <a href=http://www.miibeian.gov.cn target=_blank>京ICP证030173号</a> <a href=http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001092500412><img src=http://gimg.baidu.com/img/gs.gif></a></p></center></body></html><!--543ff95f18f36b11-->";
        String regex="<a.*?/a>";   
 
        Pattern pt=Pattern.compile(regex);
        //System.out.println(regex);
        Matcher mt=pt.matcher(s);
        String includeString=".*?baidu\.com.*?";//必须包含 字符串"baidu.com"
 
        while(mt.find())
        ...{
            if(mt.group().matches(includeString))
            ...{
                 //System.out.println(mt.group());
               
                 String s2=">.*?</a>";//标题部分
                 String s3="href=.*?>";
                  
                  Pattern pt2=Pattern.compile(s2);
                  Matcher mt2=pt2.matcher(mt.group());
                  Pattern pt3=Pattern.compile(s3);
                  Matcher mt3=pt3.matcher(mt.group());
                  while(mt2.find()&&mt3.find())
                  ...{
                      //System.out.println("标题:"+mt2.group().replaceAll(">|</a>",""));
                      //System.out.println("网址:"+mt3.group().replaceAll("href=|>",""));
                      String t=mt2.group().replaceAll(">|</a>","");
                      String u=mt3.group().replaceAll("href=|>","");
                      al.add(new ArticleList(t,u));
                  }
            }
           
        }//end while
       
        for(int i=0;i<al.size();i++)
        System.out.println(al.get(i));
        System.out.println("共有"+al.size()+"个结果");
    } 
}

文章出处:http://www.diybl.com/course/3_program/java/javajs/200843/108201.html

posted @ 2008-12-26 10:35 小马歌 阅读(1661) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 74 75 76 77 78 79 80 81 82 下一页 Last