- 博客(26)
- 资源 (1)
- 收藏
- 关注
(附)用JAVA编写MP3解码器——GUI
以下代码是开源(GPL)程序jmp123的一部分。 (一)简单的GUI 在jmp123.jar所在目录为当前目录启动jmp123.jar,启动时自动加载default.m3u、bk1.jpg、bk2.jpg;为方便测试MP3解码器,简体中文环境时播放器有网络搜索MP3功能,出于对某MP3网站的尊重,源代码中未附上搜索功能的源代码,请谅解。请勿对程序反相查看源代码,请...
2010-12-24 19:32:17 372
原创 用JAVA编写MP3解码器
《用JAVA编写MP3解码器》系列18篇文章对JAVA实现MP3解码的技术细节作介绍,本着开源的精神,文中给出完整的MPEG 1.0/2.0/2.5 Audio Layer I/II/III 解码的JAVA源代码。在哈夫曼解码、逆量化和重排序、多相合成滤波等模块中采用了卓有成效方法来提高程序运行效率;采用了IMDCT、DCT经典的快速算法,根据对算法的理解编写代码,对快速算法有详细的推导和说明;整个程序采用模块化设计,程序结构比较清晰。即使你之前对JAVA语言不太熟悉,由于JAVA的语法类似于C语言,也是很
2010-08-30 23:01:00 1697 2
原创 (十八)用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 269
原创 (十七)用JAVA编写MP3解码器——解码Layer1
Layer1的编码更简单,解码端的代码也就比Layer2还简单不少。网络上还有部分老歌是采用Layer2压缩的,但Layer1编码方式的就很难找到了,手头的编码器没有Layer1编码方式,所以这些代码没有经过测试,不详细讲解解码过程了。作为一个完整的MPEG Audio解码器,我还是加入了这部分代码。解码Layer1的源码:/** Layer1.java -- MPEG 1....
2010-08-29 14:32:25 157
原创 (十六)用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 183
原创 (十五)用JAVA编写MP3解码器——音频输出
解码一帧Layer3第10步:音频输出 -- class Audio 这里给出音频输出的示例代码,后文给出的播放器是基于命令行,所以音频输出模块就写得很简单,如果你想了解音频输出细节,请查阅《Java API文档》中javax.sound.sampled库相关方法的文档。源码中第37行调用objSDL.open方法时设置了音频缓冲区大小为176400字节。音频缓冲应该设置多...
2010-08-29 13:40:01 286
原创 (十四)用JAVA编写MP3解码器——多相合成滤波
解码一帧Layer3第8步:多相频率倒置 (Inverse Quantize Samples) 也可以称为频率倒相(Frequency Inversion),在数据进入多相滤波器前进行频率倒相,把奇数序号子带的奇数号样本乘上-1,这样做的目的是校正多相滤波器组对频率的倒相。为了充分利用decodeFrame方法内的循环,把这部分简短的代码放进decodeFrame内。 ...
2010-08-29 10:03:31 231
原创 (十三)用JAVA编写MP3解码器——IMDCT快速算法
解码一帧Layer3第7步:IMDCT和子带混合 -- class Layer3内的hybrid方法 这一步可细分为3个步骤: 1.初始化加窗系数floatWinIMDCT[][] 初始化floatWinIMDCT[][]时直接代入相关公式,我这事先另外编程用公式把加窗系数计算出来,供程序中直接查表使用,而不是运行时进行初始化。初始化floatWinIMDCT...
2010-08-28 18:14:27 194
原创 (十二)用JAVA编写MP3解码器——消混叠处理
解码一帧Layer3第6步:消混叠处理 -- class Layer3的antialias方法 消混叠(antialias)处理就是消除伪信号。相邻两个子带间互相干扰造成失真,为了减小这种影响,在信号送入IMDCT之前作消混叠处理。消混叠通过对子带作8点的蝶形变换实现。原理如下图: 图1 图2 经过逆量化后得到频域信号,一个粒度组内一个声道内共5...
2010-08-26 19:37:32 152
原创 (十一)用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 255
原创 (十)用JAVA编写MP3解码器——逆量化和重排序
解码一帧Layer3第4步:逆量化和重排序 -- requantizer方法 1.逆量化 逆量化的功能是把哈夫曼解码得到的值还原成576个频谱值。长块、短块分别用不同的公式:其中ISi为第i个哈夫曼码值,XRi为第i个逆量化值。 长块 576个频谱值分为21个增益因子(scale factor)频带(band),由intWidthLong[]保存这21...
2010-08-22 15:20:54 170
原创 (九)用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 448
原创 (八)用JAVA编写MP3解码器——解码增益因子
解码一帧Layer3第2步:解码增益因子 -- getScaleFactors_1()和getScaleFactors_2()方法 增益因子(Scale Factor)数据存储在帧内的主信息中。主信息包含增益因子和用哈夫曼编码的主数据(main_data)。增益因子简单讲就是逆量化公式的指数中的一个因子。手册中解码主数据的伪码算法如下,其中MPEG 1.0由ISO/IEC ...
2010-08-20 15:39:15 237
原创 (七)用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 255
原创 (六)用JAVA编写MP3解码器——帧数据结构
MP3文件按帧(frame)依次存储,解码时也是逐帧解码,所以我们应该首先弄清MP3帧内的数据的封装形式。帧的结构如下图所示: 图中sync表示帧同步字,每一帧以同步字开始;side info表示帧边信息;main_data_end是帧边信息结构中的一个成员。 每一帧依次存放帧头(header)、帧边信息(side information)、主信...
2010-08-19 20:39:05 427
原创 (五)用JAVA编写MP3解码器——解析文件信息
前文提到解析MP3标签,程序源码中也已经出现了调用解析MP3标签、打印MP3文件信息的功能,这儿先说说MP3文件信息的解析。 解析MP3的文件信息对MP3解码器来说只是一个附加功能,如果不加入这部分源码,同时删除掉前文源码中的相关调用,不影响解码播放。如果你想编写“迷你”型的MP3解码器,可以忽略这些附加的功能。 MP3的标签信息位于文件开始处或结尾处,用...
2010-08-19 11:34:22 280
原创 (四)用JAVA编写MP3解码器——读取文件
1.随机文件访问接口 对MP3解码时需要随机读取MP3文件,读取的文件既包括本地磁盘文件,也包括来自于网络的远程文件,两类文件按同一规范访问,为了实现这一目标,先定义一个随机文件访问接口,IRandomAccess.java,源码如下:/** IrandomAccess.java -- 随机访问文件接口** This program is free software...
2010-08-18 13:28:17 219
原创 (三)用JAVA编写MP3解码器——读取位流
文件以字节为单位读取,MP3解码器输入的数据是位流,即每次需要读取几比特,这就需要将字节流转换为比特流。解码器将文件按每次读取几比特将一个文件处理完,所以读取位流的方法以很高的频度被调用。也就是说,MP3文件是通过本类的方法每次将几比特送入解码器,从机而把一个文件解码完的。解码器的功能就是将送入的位流解码成PCM数据,然后由音频处理模块将PCM数据送入音频硬件播放。 设置缓冲区(...
2010-08-17 23:17:50 327
原创 (二)用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 260
原创 (一)用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 254
原创 JAVA实现环形缓冲多线程读取远程文件
如果用HttpURLConnection类的方法打开连接,然后用InputStream类获得输入流,再用BufferedInputStream构造出带缓冲区的输入流,如果网速太慢的话,无论缓冲区设置多大,听起来都是断断续续的,达不到真正缓冲的目的。于是尝试编写代码实现用缓冲方式读取远程文件,以下贴出的代码是我写的MP3解码器的一部分。我是不怎么赞同使用多线程下载的,加之有的链接下载速...
2010-08-15 22:37:57 161
原创 MP3解码之哈夫曼解码快速算法
哈夫曼(huffman)解码用查表法,数据组织采用树形结构,若采用二叉树,一次处理一位(bit),效率是比较低的。从一些杂志上看到关于哈夫曼(huffman)解码的快速算法介绍,直接用位流索引一次处理N(4<N<=32)位,这种方法实际上是不可行的,原因是构造出的码表很长,如果一次处理8位,可以编写程序构造出码表,不过可以肯定的是码表的长度会超过我们事先的想象,以至于没有多...
2010-08-15 22:28:50 249
原创 MP3解码之DCT(32→64)快速算法的展开
MP3解码的最后一步是“多相合成滤波”,多相合成滤波算法见ISO/IEC 11172-3 ANNEX_B Figure 3-A.2,经过5个步骤,将输入序列X[0..31]的32个采样值,变换为32个PCM样本输出:// ①Shift 64 to 1024 FIFOfor i = 64 to 1023 V[i] = V[i-64]// ②Calculate 64...
2010-08-15 22:26:04 129
MP3解码之哈夫曼解码快速算法
哈夫曼(huffman)解码用查表法,数据组织采用树形结构,若采用二叉树,一次处理一位(bit),效率是比较低的。从一些杂志上看到关于哈夫曼(huffman)解码的快速算法介绍,直接用位流索引一次处理N(4<N<=32)位,这种方法实际上是不可行的,原因是构造出的码表很长,如果一次处理8位,可以编写程序构造出码表,不过可以肯定的是码表的长度会超过我们事先的想象,以至于没有多...
2010-08-15 17:44:53 395
MP3解码之DCT快速算法的展开(旧)
MP3解码的最后一步是“多相合成滤波”,多相合成滤波算法见ISO/IEC 11172-3 ANNEX_B Figure 3-A.2,经过5个步骤,将输入序列X[0..31]的32个采样值,变换为32个PCM样本输出:// ①Shift 64 to 1024 FIFOfor i = 64 to 1023 V[i] = V[i-64]// ②Calculate 64...
2010-08-15 15:11:39 327
原创 用Direct Sound为MP3解码器libmad播放输出
WIN32平台下madplay默认采用WaveOut播放输出,本文实现为其增加Direct Sound输出。在Windows XP,VC++ 6.0测试通过。(一)优秀的MP3解码器libmad简介libmad是跨平台的基于命令行的MP3播放解码器,使用定点解码,可用于没有浮点运算的嵌入式系统。(二)下载及测试1、从官方网站ftp://ftp.mars.org/pub/mpeg/下
2008-08-03 22:58:00 4708 5
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人