- 浏览: 101017 次
- 性别:
- 来自: 北京
最新评论
-
wangshengyuan:
非常感谢博主,真是站在了巨人的肩膀上了
(五)用JAVA编写MP3解码器——解析文件信息 -
落枫飘飘:
楼主,你的播放器下载地址http://jmp123.sf.n ...
(附)用JAVA编写MP3解码器——GUI -
lfp001:
解码纯短块的增益因子时,解码得到12个频带的值。在逆量化纯短块 ...
(十)用JAVA编写MP3解码器——逆量化和重排序 -
lfp001:
逆量化混合块时:前8个频带是长块,用长块公式逆量化;后9个频带 ...
(八)用JAVA编写MP3解码器——解码增益因子 -
clearstarrysky:
短块:576个频谱值分为13个增益因子频带,但是在解码增益因子 ...
(十)用JAVA编写MP3解码器——逆量化和重排序
文章列表
前文提到解析MP3标签,程序源码中也已经出现了调用解析MP3标签、打印MP3文件信息的功能,这儿先说说MP3文件信息的解析。
解析MP3的文件信息对MP3解码器来说只是一个附加功能,如果不加入这部分源码,同时删除掉前文源码中的相关调用,不影响解码播放。如果你想编写“迷你”型的MP3解码器,可以忽略这些附加的功能。
MP3的标签信息位于文件开始处或结尾处,用于表达MP3文件的相关信息,常见的有ID3、APE等。
ID3 V1 位于文件最后的128字节,如果读取的是网络文件而服务器又不支持随机读取的话,意味着不对对其解析这部分信息。这12 ...
1.随机文件访问接口
对MP3解码时需要随机读取MP3文件,读取的文件既包括本地磁盘文件,也包括来自于网络的远程文件,两类文件按同一规范访问,为了实现这一目标,先定义一个随机文件访问接口,IRandomAccess.java,源码如下:
/*
* IrandomAccess.java -- 随机访问文件接口
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as pu ...
文件以字节为单位读取,MP3解码器输入的数据是位流,即每次需要读取几比特,这就需要将字节流转换为比特流。解码器将文件按每次读取几比特将一个文件处理完,所以读取位流的方法以很高的频度被调用。也就是说,MP3文件是通过本类的方法每次将几比特送入解码器,从机而把一个文件解码完的。解码器的功能就是将送入的位流解码成PCM数据,然后由音频处理模块将PCM数据送入音频硬件播放。
设置缓冲区(位流蓄水池)bitReservoir,解码器的其它模块在需要的时候通过调用append(int len)方法 从文件读取len字节 放进bitReservoir,仅当文件读完时append方法返回值为- ...
1.解析帧头
帧头共4字节,从高位到低位这32比特的含义如下:
比特数
名称
内容
11
sync
0x7FF
2
version
1=mpeg1.0, 0=mpeg2.0
2
lay
4-lay = layerI, II or III
1
error protection
0=yes, 1=no
4
bitrate_index
见下文
2
sampling_freq
见下文
1
padding
填充位
1
extension
见下文
2
mode
见下文
2
mode_ext ...
如果用HttpURLConnection类的方法打开连接,然后用InputStream类获得输入流,再用BufferedInputStream构造出带缓冲区的输入流,如果网速太慢的话,无论缓冲区设置多大,听起来都是断断续续的,达不到真正缓冲的目的。于是尝试编写代码实现用缓冲方式读取远程文件,以下贴出的代码是我写的MP3解码器的一部分。我是不怎么赞同使用多线程下载的,加之有的链接下载速度本身就比较快,所以在下载速度足够的情况下,就让下载线程退出,直到只剩下一个下载线程。多线程中的同步、HttpURLConnection的超时阻塞等因素都会使代码看起来异常复杂。
问题模型 ...
哈夫曼(huffman)解码用查表法,数据组织采用树形结构,若采用二叉树,一次处理一位(bit),效率是比较低的。从一些杂志上看到关于哈夫曼(huffman)解码的快速算法介绍,直接用位流索引一次处理N(4<N<=32)位,这种方法实际上是不可行的,原因是构造出的码表很长,如果一次处理8位,可以编写程序构造出码表,不过可以肯定的是码表的长度会超过我们事先的想象,以至于没有多大的实用价值。一次处理多位(一位以上)码表中冗余度很大导致码表很长。
MP3解码处理主数据(main_data)的第一步就是对主数据进行哈夫曼解码。MP3编解码用到的哈夫曼表由ISO/IE ...
MP3解码的最后一步是“多相合成滤波”,多相合成滤波算法见ISO/IEC 11172-3 ANNEX_B Figure 3-A.2,经过5个步骤,将输入序列X[0..31]的32个采样值,变换为32个PCM样本输出:
// ①Shift 64 to 1024 FIFO
for i = 64 to 1023
V[i] = V[i-64]
// ②Calculate 64 values V[i] by matrixing
for i = 0 to 63
for k = 0 to 31
V[i] += N[i][k] * X[k]
// 其 ...
哈夫曼(huffman)解码用查表法,数据组织采用树形结构,若采用二叉树,一次处理一位(bit),效率是比较低的。从一些杂志上看到关于哈夫曼(huffman)解码的快速算法介绍,直接用位流索引一次处理N(4<N<=32)位,这种方法实际上是不可行的,原因是构造出的码表很长,如果一次处理8位,可以编写程序构造出码表,不过可以肯定的是码表的长度会超过我们事先的想象,以至于没有多大的实用价值。一次处理多位(一位以上)码表中冗余度很大导致码表很长。
MP3解码处理主数据(main_data)的第一步就是对主数据进行哈夫曼解码。MP3编解码用到的哈夫曼表由ISO/IE ...
MP3解码的最后一步是“多相合成滤波”,多相合成滤波算法见ISO/IEC 11172-3 ANNEX_B Figure 3-A.2,经过5个步骤,将输入序列X[0..31]的32个采样值,变换为32个PCM样本输出:
// ①Shift 64 to 1024 FIFO
for i = 64 to 1023
V[i] = V[i-64]
// ②Calculate 64 values V[i] by matrixing
for i = 0 to 63
for k = 0 to 31
V[i] += N[i][k] * X[k]
// 其 ...