自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

JAVA MP3 Decoder

纯JAVA mpeg-1/mpeg-2 layer I/II/II 解码器

2011-01-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除