`
lfp001
  • 浏览: 100585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(十七)用JAVA编写MP3解码器——解码Layer1

阅读更多

      Layer1的编码更简单,解码端的代码也就比Layer2还简单不少。网络上还有部分老歌是采用Layer2压缩的,但Layer1编码方式的就很难找到了,手头的编码器没有Layer1编码方式,所以这些代码没有经过测试,不详细讲解解码过程了。作为一个完整的MPEG Audio解码器,我还是加入了这部分代码。解码Layer1的源码:

/*
* Layer1.java -- MPEG 1.0 Audio Layer I Decoder
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
* If you would like to negotiate alternate licensing terms, you may do
* so by contacting the author: <http://jmp123.sourceforge.net/>
*/
package decoder;

public final class Layer1 implements ILayer123 {
	Header header;
	BitStream bs;
	Synthesis filter;
	float[] factor;
	byte[][] allocation;	//[2][32]
	byte[][] scalefactor;	//[2][32]
	float[][] syin;			//[2][32]

	public Layer1(BitStream bitstream,Header h, Synthesis filter, int wch) {
		header = h;
		bs = bitstream;
		this.filter = filter;
		allocation = new byte[2][32];
		scalefactor = new byte[2][32];
		syin = new float[2][32];
		factor = Layer2.factor;		// ISO/IEC 11172-3 Table 3-B.1.
	}

	/*
	 * 逆量化公式:
	 * s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1))
	 * s' = factor * s''
	 */
	float requantization(int ch, int sb, int nb) {
		int samplecode = bs.getBits17(nb);
		int nlevels = (1 << nb);
		float requ = 2.0f * samplecode / nlevels - 1.0f;	//s'''
		requ += (float)Math.pow(2, 1-nb);
		requ *= nlevels / (nlevels - 1);		//s''
		requ *= factor[scalefactor[ch][sb]];	//s'
		return requ;
	}

	public void decodeFrame() throws Exception {
		int sb, gr, ch, nb;
		int nch = header.getChannels();
		int bound = (header.getMode() == 1) ? ((header.getModeExtension() + 1) * 4) : 32;
		int slots = header.getMainDataSlots();
		bs.append(slots);
		int maindata_begin = bs.getBytePos();

		//1. Bit allocation decoding
		for (sb = 0; sb < bound; sb++)
			for (ch = 0; ch < nch; ++ch) {
				nb = bs.getBits9(4);
				if (nb == 15)
					throw new Exception("decodeFrame()->nb=15");
				allocation[ch][sb] = (byte)((nb != 0) ? (nb + 1) : 0);
			}
		for (sb = bound; sb < 32; sb++) {
			nb = bs.getBits9(4);
			if (nb == 15)
				throw new Exception("decodeFrame()->nb=15");
			allocation[0][sb] = (byte)((nb != 0) ? (nb + 1) : 0);
		}

		//2. Scalefactor decoding
		for (sb = 0; sb < 32; sb++)
			for (ch = 0; ch < nch; ch++)
				if (allocation[ch][sb] != 0)
					scalefactor[ch][sb] = (byte)bs.getBits9(6);

		for (gr = 0; gr < 12; gr++) {
			//3. Requantization of subband samples
			for (sb = 0; sb < bound; sb++)
				for (ch = 0; ch < nch; ch++){
					nb = allocation[ch][sb];
					if(nb == 0)
						syin[ch][sb] = 0;
					else
						syin[ch][sb] = requantization(ch, sb, nb);
				}
			//mode=1(Joint Stereo)
			for (sb = bound; sb < 32; ++sb)
				if ((nb = allocation[0][sb]) != 0)
					for (ch = 0; ch < nch; ++ch)
						syin[ch][sb] = requantization(ch, sb, nb);
				else
					for (ch = 0; ch < nch; ++ch)
						syin[ch][sb] = 0;
			
			//4. Synthesis subband filter
			for (ch = 0; ch < nch; ch++)
				filter.synthesisSubBand(syin[ch], ch);
		}

		//5. Ancillary bits
		int discard = slots + maindata_begin - bs.getBytePos();
		bs.skipBytes(discard);
	}
}

 

 

上一篇:(十六)用JAVA编写MP3解码器——解码Layer2

下一篇:(十八)用JAVA编写MP3解码器——迷你播放器 

 

【下载地址】http://jmp123.sourceforge.net/

分享到:
评论

相关推荐

    java编写的解码器

    Java编写的解码器是一种基于Java编程语言实现的软件组件,专门用于解析和播放MP3音频文件。在本文中,我们将深入探讨Java MP3解码器的原理、实现细节以及其在面试和项目中的应用。 首先,理解MP3格式是至关重要的。...

    java的mp3解码器(非JMF、控制台播放音乐)

    标签"java mp3 无JMF 解码器"进一步强调了这个解码器的关键特性:它是用Java语言编写的,专注于MP3格式,且不依赖JMF。这使得它具有跨平台性,可以在任何支持Java的系统上运行。 压缩包内的文件"jmp123_400_utf8_...

    java mp3 音频文件解码器

    总结来说,Java MP3音频文件解码器是一个独立的、用纯Java编写的工具,用于将MP3文件转换为可处理的原始音频数据。它的设计和实现涉及了音频编码原理、数据处理优化以及Java编程技术,对于理解和处理音频数据的...

    纯JAVA的MP3解码器jmp

    《纯JAVA的MP3解码器jmp:深入解析与应用》 MP3解码器是数字音频处理领域的重要工具,它能够将存储的MP3格式音频数据转化为人类可听的声音信号。在众多的MP3解码器中,“jmp123”以其独特的纯JAVA实现和出色的性能...

    C++实现的Mp3解码器

    这些头文件对于使用解码器的开发者来说至关重要,因为它们提供了与解码器交互的API,包括打开MP3文件、初始化解码器、解码音频帧和获取解码后的声音数据等功能。 最后,`Makefile`是构建系统的配置文件,它定义了...

    基于通用可编程GPU的视频编解码器——架构、算法与实现

    基于通用可编程GPU的视频编解码器——架构、算法与实现

    mp3解码算法原理——具体解码算法

    ### MP3解码算法原理详解 #### 一、概述 MP3作为一种广泛使用的音频压缩格式,其高效的数据压缩技术使其成为数字音乐领域的标准之一。本文将深入探讨MP3解码的具体算法及其工作原理,帮助读者更好地理解MP3格式的...

    mina自定义编解码器详解

    - 文件`example`可能包含了一个使用mina编写的服务器或客户端程序,其中包含了自定义编解码器的应用实例。 - `MinaCodec`可能是一个包含编码器和解码器的类,我们来详细分析其工作流程: - 在编码器中,通常有一...

    java编写mp3播放器.doc

    例如,Decoder.java负责核心的解码逻辑,Header.java处理MP3文件的头部信息,ILayer123.java处理Layer 1、2、3的相关解码工作,而BitStream.java则处理位流的读取。此外,还有用于处理HTTP流和文件随机访问的辅助类...

    java编写的mp3播放器

    Java编写的MP3播放器是一种基于Java编程语言开发的软件应用,主要用于播放音频文件,特别是MPEG音频层3(MP3)格式的音乐。在Java中实现MP3播放功能涉及多个核心技术和组件,下面将详细阐述相关的知识点。 1. **...

    mp3解码器论文和Java源码

    通过学习和实践,可以增强对音频编码解码的理解,掌握核心算法,并能动手编写自己的MP3解码器。不过,要注意的是,实际开发过程中还需要考虑版权问题和兼容性问题,确保解码器能处理各种不同编码标准的MP3文件。

    jmf_mp3解码器

    总的来说,"jmf_mp3解码器"结合JLayer1.0.1的使用,为Java开发者提供了一个跨平台的解决方案,使得在Java应用程序中播放MP3文件变得简单而有效。这种技术的应用场景广泛,可以用于开发音乐播放器、多媒体教学软件、...

    MPEG1-Layer-3.rar_MPEG layer 3 (.mp3)_compression mpeg mp3_音乐 压缩

    MP3是 ISO/MPEG标准的一部分,ISO/MPEG标准描述了使用高性能感知编码方案的音频压缩,此标准一直在不断更新以满足“质高量小”的追求,现已形成 MPEG Layer 1、Layer 2、Layer 3三个音频编码解码方案。MPEG Layer 3...

    H.264编解码器——jm最新版14.2

    在描述中提到的VC下的C工程源码,意味着这个编解码器是用C语言编写,并且可以在Visual C++环境下编译和运行。这对于软件开发者来说非常有用,因为C语言的源代码通常更容易理解和修改,便于进行二次开发和定制。 ...

    silk2mp3解码器

    MP3(MPEG-1 Audio Layer 3)是目前最广泛使用的音频压缩格式之一。它使用了一种有损压缩方法,通过去除人耳难以察觉的高频部分来降低文件大小,从而节省存储空间。MP3文件可以在大多数设备上播放,包括电脑、手机和...

    最优mp3解码器,千千静听,酷狗使用

    在本文中,我们将深入探讨MP3解码器的工作原理、千千静听和酷狗这两款流行的音乐播放器如何利用解码库来播放MP3文件,以及libmad这个特定的解码库。 首先,我们来看看MP3解码的基本过程。当一个MP3文件被创建时,...

    mp3解码源码layer3.rar

    本文将详细解析"mp3解码源码layer3.rar"压缩包中涉及的关键源代码文件和解码过程。 MP3编码利用了人类听觉系统的特性和冗余,采用离散余弦变换(DCT)和熵编码等技术进行高效压缩。解码过程则相反,需要逆向执行...

    jmp123JAVA MP3解码

    JMP123是专门为Java开发者设计的轻量级MP3解码器,支持多种MP3编码方式,包括MPEG-1 Audio Layer III(通常所说的MP3)和MPEG-2 Audio Layer III。该库提供了一套简单的API,使得开发者能够方便地集成到自己的应用...

    java对于MP3的spi

    这个库可能包含了MP3解码器,将压缩的MP3数据转换为Java Sound API可以理解和播放的原始PCM音频数据。使用这个库,开发者无需关心底层的解码细节,只需调用Java Sound API提供的类和方法,就能实现MP3文件的播放。 ...

Global site tag (gtag.js) - Google Analytics