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

本文介绍了如何使用JAVA编写MP3解码器,包括解码接口定义、解码器封装、播放器的实现。文章强调了解码关键算法的重要性,并提供了一个简单的命令行迷你播放器的实现,该播放器利用多线程保证解码播放的流畅性。作者还分享了程序的源码和下载链接,鼓励读者探索和改进解码技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.定义解码一帧的接口   ILayer123

  Layer1、Layer2和Layer3这三个类都实现了ILayer123的decodeFrame方法。

// ILayer123.java
package jmp123.decoder;

public interface ILayer123 {
	public void decodeFrame(int intFirstChannel, int intLastChannel) throws Exception;
}

 

  2.封装解码器 对帧头解码之后可以知道当前待解码的文件是采用MPEG Audio的哪一层压缩方式,根据压缩层的 不同,解码器自动初始化Layer1、Layer2和Layer3这三个类中的某一个实例。你也就明白了为什么我们把这三 个类的大部分初始化放在其构造方法内的道理了。class Decoder的decodeFrame方法完成解码和播放一帧的任务。  

//Decoder.java
package jmp123.decoder;

import jmp123.output.Audio;

public final class Decoder {
	public final static int CH_LEFT = 0;
	public final static int CH_RIGHT = 1;
	public final static int CH_BOTH = 2;
	private static int intFirstChannel, intLastChannel;
	private static int intChannels;
	private static int intOutputChannel;
	private static int intForwardMultiple;
	private ILayer123 layer123;

	public Decoder(BitStream objBS, Header objHeader) {
		intChannels = objHeader.getChannels();
		switch(objHeader.getLayer()) {
		case 1:
			layer123 = new Layer1(objBS, objHeader);
			break;
		case 2:
			layer123 = new Layer2(objBS, objHeader);
			break;
		case 3:
			layer123 = new Layer3(objBS, objHeader);
			break;
		}

		// 设置参数缺省值
		intForwardMultiple = 1;
		setOutputChannel(CH_BOTH);
	}

	public void decodeFrame() throws Exception {
		layer123.decodeFrame(intFirstChannel, intLastChannel);

		if(intChannels == 1 && intOutputChannel == CH_BOTH) {
			int i;
			byte[] buf = Synthesis.bytePCMBuf;
			for(i = 0; i < 4608; i += 4) {
				buf[i+2] = buf[i];
				buf[i+3] = buf[i+1];
			}
		}

		if(intForwardMultiple == 1)
			Audio.write(Synthesis.bytePCMB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值