
JMP123
文章平均质量分 89
lfp001
这个作者很懒,什么都没留下…
展开
-
(一)用JAVA编写MP3解码器——前言
【内容提要】 《用JAVA编写MP3解码器》系列文章将对JAVA实现MP3解码的技术细节作介绍,本着开源的精神,文中给出完整的MPEG 1.0/2.0/2.5 Audio Layer I/II/III 解码的JAVA源代码。在哈夫曼解码、逆量化和重排序、多相合成滤波等模块中采用了卓有成效方法来提高程序运行效率;采用了IMDCT、DCT经典的快速算法,根据自己对算法的理解编写代码,对快速算法...原创 2010-08-17 21:04:33 · 317 阅读 · 0 评论 -
(十七)用JAVA编写MP3解码器——解码Layer1
Layer1的编码更简单,解码端的代码也就比Layer2还简单不少。网络上还有部分老歌是采用Layer2压缩的,但Layer1编码方式的就很难找到了,手头的编码器没有Layer1编码方式,所以这些代码没有经过测试,不详细讲解解码过程了。作为一个完整的MPEG Audio解码器,我还是加入了这部分代码。解码Layer1的源码:/** Layer1.java -- MPEG 1....原创 2010-08-29 14:32:25 · 191 阅读 · 0 评论 -
(十六)用JAVA编写MP3解码器——解码Layer2
MPEG 1.0/2.0/2.5 对声音的压缩分三层:Layer I、Layer II和Layer III。相比于Layer3,Layer2的解码就简单得多了。 1.变量初始化 申明的成员变量在构造方法内初始化,这些常量值是从解码规范的文档里直接COPY过来的。 2.帧的数据结构 以Layer2编码的文件按帧存放,解码时也是逐帧解码。每一帧内依次存放位...原创 2010-08-29 14:17:55 · 231 阅读 · 0 评论 -
(十五)用JAVA编写MP3解码器——音频输出
解码一帧Layer3第10步:音频输出 -- class Audio 这里给出音频输出的示例代码,后文给出的播放器是基于命令行,所以音频输出模块就写得很简单,如果你想了解音频输出细节,请查阅《Java API文档》中javax.sound.sampled库相关方法的文档。源码中第37行调用objSDL.open方法时设置了音频缓冲区大小为176400字节。音频缓冲应该设置多...原创 2010-08-29 13:40:01 · 356 阅读 · 0 评论 -
(十四)用JAVA编写MP3解码器——多相合成滤波
解码一帧Layer3第8步:多相频率倒置 (Inverse Quantize Samples) 也可以称为频率倒相(Frequency Inversion),在数据进入多相滤波器前进行频率倒相,把奇数序号子带的奇数号样本乘上-1,这样做的目的是校正多相滤波器组对频率的倒相。为了充分利用decodeFrame方法内的循环,把这部分简短的代码放进decodeFrame内。 ...原创 2010-08-29 10:03:31 · 292 阅读 · 0 评论 -
(十三)用JAVA编写MP3解码器——IMDCT快速算法
解码一帧Layer3第7步:IMDCT和子带混合 -- class Layer3内的hybrid方法 这一步可细分为3个步骤: 1.初始化加窗系数floatWinIMDCT[][] 初始化floatWinIMDCT[][]时直接代入相关公式,我这事先另外编程用公式把加窗系数计算出来,供程序中直接查表使用,而不是运行时进行初始化。初始化floatWinIMDCT...原创 2010-08-28 18:14:27 · 282 阅读 · 0 评论 -
(十二)用JAVA编写MP3解码器——消混叠处理
解码一帧Layer3第6步:消混叠处理 -- class Layer3的antialias方法 消混叠(antialias)处理就是消除伪信号。相邻两个子带间互相干扰造成失真,为了减小这种影响,在信号送入IMDCT之前作消混叠处理。消混叠通过对子带作8点的蝶形变换实现。原理如下图: 图1 图2 经过逆量化后得到频域信号,一个粒度组内一个声道内共5...原创 2010-08-26 19:37:32 · 188 阅读 · 0 评论 -
(十一)用JAVA编写MP3解码器——立体声处理
解码一帧Layer3第5步:立体声处理 -- class Layer3的ms_stereo和i_stereo方法 MP3采用的立体声编码方式有中侧立体和强度立体声两种。 1.中侧立体声(Middle/Side stereo)简称MS_stereo,在这种模式中,用中/侧声道规格化值Mi/Si取代左/右声道的值Li/Ri,重建左/右声道的值Li/Ri用下述公式:...原创 2010-08-25 14:32:19 · 315 阅读 · 0 评论 -
(十)用JAVA编写MP3解码器——逆量化和重排序
解码一帧Layer3第4步:逆量化和重排序 -- requantizer方法 1.逆量化 逆量化的功能是把哈夫曼解码得到的值还原成576个频谱值。长块、短块分别用不同的公式:其中ISi为第i个哈夫曼码值,XRi为第i个逆量化值。 长块 576个频谱值分为21个增益因子(scale factor)频带(band),由intWidthLong[]保存这21...原创 2010-08-22 15:20:54 · 208 阅读 · 0 评论 -
(九)用JAVA编写MP3解码器——哈夫曼解码
解码一帧Layer3第3步:哈夫曼解码 -- huffmanDecoder方法 1.哈夫曼码表 共有33张码表,从ISO/IEC 11172-3复制一张码表出来,看看码表的庐山真面目,下面说到的哈夫曼树的构造及解码过程都以这一张表为例。码表如下所示:Huffman code table 6 x y hlen hcod No. 0 0 3 111 0 0 1 3 011 1 0...原创 2010-08-21 16:21:17 · 528 阅读 · 0 评论 -
(八)用JAVA编写MP3解码器——解码增益因子
解码一帧Layer3第2步:解码增益因子 -- getScaleFactors_1()和getScaleFactors_2()方法 增益因子(Scale Factor)数据存储在帧内的主信息中。主信息包含增益因子和用哈夫曼编码的主数据(main_data)。增益因子简单讲就是逆量化公式的指数中的一个因子。手册中解码主数据的伪码算法如下,其中MPEG 1.0由ISO/IEC ...原创 2010-08-20 15:39:15 · 298 阅读 · 0 评论 -
(七)用JAVA编写MP3解码器——解码帧边信息
解码一帧Layer3第1步:帧边信息解码 -- getSideInfo()方法 帧边信息用于描述一帧内的主信息(增益因子和主数据)特征,而后文讲到的解码的增益因子、主数据是描述一个声道的,换一种说法,帧边信息每帧连续存储在一处,增益因子和主数据(可能多达各4个)分散存储在每帧数据中的2处(MPEG 1.0的单声道/MPEG 2.0/2.5的2声道)或4处(MPEG 1.0的2...原创 2010-08-20 11:39:13 · 325 阅读 · 0 评论 -
(六)用JAVA编写MP3解码器——帧数据结构
MP3文件按帧(frame)依次存储,解码时也是逐帧解码,所以我们应该首先弄清MP3帧内的数据的封装形式。帧的结构如下图所示: 图中sync表示帧同步字,每一帧以同步字开始;side info表示帧边信息;main_data_end是帧边信息结构中的一个成员。 每一帧依次存放帧头(header)、帧边信息(side information)、主信...原创 2010-08-19 20:39:05 · 514 阅读 · 0 评论 -
(五)用JAVA编写MP3解码器——解析文件信息
前文提到解析MP3标签,程序源码中也已经出现了调用解析MP3标签、打印MP3文件信息的功能,这儿先说说MP3文件信息的解析。 解析MP3的文件信息对MP3解码器来说只是一个附加功能,如果不加入这部分源码,同时删除掉前文源码中的相关调用,不影响解码播放。如果你想编写“迷你”型的MP3解码器,可以忽略这些附加的功能。 MP3的标签信息位于文件开始处或结尾处,用...原创 2010-08-19 11:34:22 · 355 阅读 · 0 评论 -
(四)用JAVA编写MP3解码器——读取文件
1.随机文件访问接口 对MP3解码时需要随机读取MP3文件,读取的文件既包括本地磁盘文件,也包括来自于网络的远程文件,两类文件按同一规范访问,为了实现这一目标,先定义一个随机文件访问接口,IRandomAccess.java,源码如下:/** IrandomAccess.java -- 随机访问文件接口** This program is free software...原创 2010-08-18 13:28:17 · 276 阅读 · 0 评论 -
(三)用JAVA编写MP3解码器——读取位流
文件以字节为单位读取,MP3解码器输入的数据是位流,即每次需要读取几比特,这就需要将字节流转换为比特流。解码器将文件按每次读取几比特将一个文件处理完,所以读取位流的方法以很高的频度被调用。也就是说,MP3文件是通过本类的方法每次将几比特送入解码器,从机而把一个文件解码完的。解码器的功能就是将送入的位流解码成PCM数据,然后由音频处理模块将PCM数据送入音频硬件播放。 设置缓冲区(...原创 2010-08-17 23:17:50 · 389 阅读 · 0 评论 -
(二)用JAVA编写MP3解码器——帧头信息解码
1.解析帧头 帧头共4字节,从高位到低位这32比特的含义如下:比特数名称内容11sync0x7FF2version1=mpeg1.0, 0=mpeg2.02lay4-lay = layerI, II or III1error protection0=yes, 1=no4bitrate_index...原创 2010-08-17 21:43:11 · 325 阅读 · 0 评论 -
(十八)用JAVA编写MP3解码器——迷你播放器
1.定义解码一帧的接口 ILayer123 Layer1、Layer2和Layer3这三个类都实现了ILayer123的decodeFrame方法。// ILayer123.javapackage jmp123.decoder;public interface ILayer123 { public void decodeFrame(int intFirstC...原创 2010-08-30 18:01:49 · 312 阅读 · 0 评论