
java解码
文章平均质量分 92
ycb1689
这个作者很懒,什么都没留下…
展开
-
(十八)用JAVA编写MP3解码器——迷你播放器
1.定义解码一帧的接口 ILayer123 Layer1、Layer2和Layer3这三个类都实现了ILayer123的decodeFrame方法。// ILayer123.javapackage jmp123.decoder;public interface ILayer123 { public void decodeFrame(int intFirstChan原创 2013-12-18 12:28:53 · 1486 阅读 · 1 评论 -
(十六)用JAVA编写MP3解码器——解码Layer2
MPEG 1.0/2.0/2.5 对声音的压缩分三层:Layer I、Layer II和Layer III。相比于Layer3,Layer2的解码就简单得多了。 1.变量初始化 申明的成员变量在构造方法内初始化,这些常量值是从解码规范的文档里直接COPY过来的。 2.帧的数据结构 以Layer2编码的文件按帧存放,解码时也是逐帧解码。每一帧内依次存放位分配信息、增益原创 2013-12-18 12:22:56 · 1126 阅读 · 0 评论 -
(八)用JAVA编写MP3解码器——解码增益因子
解码一帧Layer3第2步:解码增益因子 -- getScaleFactors_1()和getScaleFactors_2()方法 增益因子(Scale Factor)数据存储在帧内的主信息中。主信息包含增益因子和用哈夫曼编码的主数据(main_data)。增益因子简单讲就是逆量化公式的指数中的一个因子。手册中解码主数据的伪码算法如下,其中MPEG 1.0由ISO/IE原创 2013-12-18 12:03:52 · 1491 阅读 · 0 评论 -
(十五)用JAVA编写MP3解码器——音频输出
解码一帧Layer3第10步:音频输出 -- class Audio 这里给出音频输出的示例代码,后文给出的播放器是基于命令行,所以音频输出模块就写得很简单,如果你想了解音频输出细节,请查阅《Java API文档》中javax.sound.sampled库相关方法的文档。源码中第37行调用objSDL.open方法时设置了音频缓冲区大小为176400字节。音频缓冲应该设置多大原创 2013-12-18 12:22:09 · 2627 阅读 · 0 评论 -
(十四)用JAVA编写MP3解码器——多相合成滤波
解码一帧Layer3第8步:多相频率倒置 (Inverse Quantize Samples) 也可以称为频率倒相(Frequency Inversion),在数据进入多相滤波器前进行频率倒相,把奇数序号子带的奇数号样本乘上-1,这样做的目的是校正多相滤波器组对频率的倒相。为了充分利用decodeFrame方法内的循环,把这部分简短的代码放进decodeFrame内。原创 2013-12-18 12:21:15 · 1569 阅读 · 1 评论 -
(十三)用JAVA编写MP3解码器——IMDCT快速算法
解码一帧Layer3第7步:IMDCT和子带混合 -- class Layer3内的hybrid方法 这一步可细分为3个步骤: 1.初始化加窗系数floatWinIMDCT[][] 初始化floatWinIMDCT[][]时直接代入相关公式,我这事先另外编程用公式把加窗系数计算出来,供程序中直接查表使用,而不是运行时进行初始化。初始化floatWinIMDCT[原创 2013-12-18 12:16:04 · 2271 阅读 · 0 评论 -
(十二)用JAVA编写MP3解码器——消混叠处理
解码一帧Layer3第6步:消混叠处理 -- class Layer3的antialias方法 消混叠(antialias)处理就是消除伪信号。相邻两个子带间互相干扰造成失真,为了减小这种影响,在信号送入IMDCT之前作消混叠处理。消混叠通过对子带作8点的蝶形变换实现。原理如下图:图1图2 经过逆量化后得到频域信号,一个粒度组内一个声道内共576个原创 2013-12-18 12:12:58 · 1036 阅读 · 0 评论 -
(十一)用JAVA编写MP3解码器——立体声处理
解码一帧Layer3第5步:立体声处理 -- class Layer3的ms_stereo和i_stereo方法 MP3采用的立体声编码方式有中侧立体和强度立体声两种。 1.中侧立体声(Middle/Side stereo)简称MS_stereo,在这种模式中,用中/侧声道规格化值Mi/Si取代左/右声道的值Li/Ri,重建左/右声道的值Li/Ri用下述公式:原创 2013-12-18 12:10:45 · 1306 阅读 · 0 评论 -
(十)用JAVA编写MP3解码器——逆量化和重排序
解码一帧Layer3第4步:逆量化和重排序 -- requantizer方法 1.逆量化 逆量化的功能是把哈夫曼解码得到的值还原成576个频谱值。长块、短块分别用不同的公式:其中ISi为第i个哈夫曼码值,XRi为第i个逆量化值。 长块 576个频谱值分为21个增益因子(scale factor)频带(band),由intWidthLong[]保存这21个原创 2013-12-18 12:09:04 · 1443 阅读 · 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 00 1 3 0原创 2013-12-18 12:06:38 · 2111 阅读 · 0 评论 -
(七)用JAVA编写MP3解码器——解码帧边信息
解码一帧Layer3第1步:帧边信息解码 --getSideInfo()方法 帧边信息用于描述一帧内的主信息(增益因子和主数据)特征,而后文讲到的解码的增益因子、主数据是描述一个声道的,换一种说法,帧边信息每帧连续存储在一处,增益因子和主数据(可能多达各4个)分散存储在每帧数据中的2处(MPEG 1.0的单声道/MPEG 2.0/2.5的2声道)或4处(MPEG 1.0的原创 2013-12-18 12:02:28 · 2210 阅读 · 0 评论 -
(六)用JAVA编写MP3解码器——帧数据结构
MP3文件按帧(frame)依次存储,解码时也是逐帧解码,所以我们应该首先弄清MP3帧内的数据的封装形式。帧的结构如下图所示: 图中sync表示帧同步字,每一帧以同步字开始;side info表示帧边信息;main_data_end是帧边信息结构中的一个成员。 每一帧依次存放帧头(header)、帧边信息(side information)、主信息(mai原创 2013-12-18 11:49:29 · 2825 阅读 · 1 评论 -
(五)用JAVA编写MP3解码器——解析文件信息
前文提到解析MP3标签,程序源码中也已经出现了调用解析MP3标签、打印MP3文件信息的功能,这儿先说说MP3文件信息的解析。 解析MP3的文件信息对MP3解码器来说只是一个附加功能,如果不加入这部分源码,同时删除掉前文源码中的相关调用,不影响解码播放。如果你想编写“迷你”型的MP3解码器,可以忽略这些附加的功能。 MP3的标签信息位于文件开始处或结尾处,用于表达MP原创 2013-12-18 11:31:48 · 3029 阅读 · 0 评论 -
(四)用JAVA编写MP3解码器——读取文件
1.随机文件访问接口 对MP3解码时需要随机读取MP3文件,读取的文件既包括本地磁盘文件,也包括来自于网络的远程文件,两类文件按同一规范访问,为了实现这一目标,先定义一个随机文件访问接口,IRandomAccess.java,源码如下: /** IrandomAccess.java -- 随机访问文件接口** This program is free softwa原创 2013-12-18 11:30:24 · 1862 阅读 · 0 评论 -
(三)用JAVA编写MP3解码器——读取位流
文件以字节为单位读取,MP3解码器输入的数据是位流,即每次需要读取几比特,这就需要将字节流转换为比特流。解码器将文件按每次读取几比特将一个文件处理完,所以读取位流的方法以很高的频度被调用。也就是说,MP3文件是通过本类的方法每次将几比特送入解码器,从机而把一个文件解码完的。解码器的功能就是将送入的位流解码成PCM数据,然后由音频处理模块将PCM数据送入音频硬件播放。 设置缓冲区(原创 2013-12-18 11:26:25 · 2919 阅读 · 0 评论 -
(二)用JAVA编写MP3解码器——帧头信息解码
1.解析帧头 帧头共4字节,从高位到低位这32比特的含义如下:比特数名称内容11sync0x7FF2version1=mpeg1.0, 0=mpeg2.02lay4-lay = layerI, II or III1error protection0=yes, 1=no4b原创 2013-12-18 11:25:06 · 3448 阅读 · 2 评论 -
(十七)用JAVA编写MP3解码器——解码Layer1
Layer1的编码更简单,解码端的代码也就比Layer2还简单不少。网络上还有部分老歌是采用Layer2压缩的,但Layer1编码方式的就很难找到了,手头的编码器没有Layer1编码方式,所以这些代码没有经过测试,不详细讲解解码过程了。作为一个完整的MPEG Audio解码器,我还是加入了这部分代码。解码Layer1的源码:/** Layer1.java -- MPEG 1.0 Audio原创 2013-12-18 12:23:42 · 1094 阅读 · 1 评论 -
用JAVA编写MP3解码器——GUI
以下代码是开源(GPL)程序jmp123的一部分。 (一)简单的GUI 在jmp123.jar所在目录为当前目录启动jmp123.jar,启动时自动加载default.m3u、bk1.jpg、bk2.jpg;为方便测试MP3解码器,简体中文环境时播放器有网络搜索MP3功能,出于对某MP3网站的尊重,源代码中未附上搜索功能的源代码,请谅解。请勿对程序反相查看源代码原创 2013-12-18 12:43:48 · 9834 阅读 · 3 评论