文档章节

(十五)用JAVA编写MP3解码器——音频输出

暗之幻影
 暗之幻影
发布于 2015/01/04 15:29
字数 646
阅读 69
收藏 2

解码一帧Layer3第10步:音频输出  -- class Audio

 

      这里给出音频输出的示例代码,后文给出的播放器是基于命令行,所以音频输出模块就写得很简单,如果你想了解音频输出细节,请查阅《Java API文档》中javax.sound.sampled库相关方法的文档。源码中第37行调用objSDL.open方法时设置了音频缓冲区大小为176400字节。音频缓冲应该设置多大比较好呢?这和你的音频硬件有关,缓冲区设置为合适的值有利于提高性能(官方文档上是这么说的)。前面讲到采用标准立体声编码的MP3一帧有2304个PCM样本,16位PCM输出时长度为4608字节。若PCM样本的采样率为44100Hz,那么解码端播放时一个声道每秒送入音频硬件的PCM样本数为44100个,立体声的话就是44100*2=88200个,这88200个PCM样本的长度为88200*2=176400字节。MP3一帧的播放时长为4608/176400秒(约等于26毫秒),解码器显然能在26ms内完成解码一帧并将PCM写入到音频输出模块。无论采用什么样的MP3编码方式,每帧的播放时长是相同的。关于音频缓冲区就说到这儿,缓冲区设为多大,你自己看着办哈~

 

class Audio 源码如下:

/*
* Audio.java -- 音频输出示例
* Copyright (C) 2010
*
* 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 output;

import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;

public final class Audio {
	private static SourceDataLine objSDL;

	// Start Output
	public static void open(int intFreq, int iBits, int channels) throws Exception {
		AudioFormat af = new AudioFormat(intFreq, 16, channels, true, false);
		DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
		objSDL = (SourceDataLine) AudioSystem.getLine(info);
		//objSDL.open(af);
		objSDL.open(af, 176400);
		objSDL.start();
	}

	public static void write(byte[] b, int len) {
		objSDL.write(b, 0, len);
	}

	/*
	* bPause=true pause; bPause=false resume
	*/
	public static void pause(boolean bPause) {
		if(bPause)
			objSDL.stop();
		else
			objSDL.start();
	}

	// Close Output
	public static void close() {
		objSDL.drain();
		objSDL.stop();
		objSDL.close();
		objSDL = null;
	}
}

  

上一篇:(十四)用JAVA编写MP3解码器——多相合成滤波

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

 

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

本文转载自:http://lfp001.iteye.com/blog/750060

暗之幻影
粉丝 20
博文 377
码字总数 71245
作品 0
南京
高级程序员
私信 提问
(五)用JAVA编写MP3解码器——解析文件信息

前文提到解析MP3标签,程序源码中也已经出现了调用解析MP3标签、打印MP3文件信息的功能,这儿先说说MP3文件信息的解析。 解析MP3的文件信息对MP3解码器来说只是一个附加功能,如果不加入这部...

暗之幻影
2015/01/04
61
0
疯狂Spring Cloud连载(11)——Feign的编码器与解码器

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/23
3.1K
5
机顶盒音频格式-背景音乐/音效

机顶盒音频格式: 1、机顶盒直接音频输出必须支持单声道、双声道及 5.1 声道; 2、JVM 必须支持单声道、双声道,但 5.1 声道为可选; 3、EPG 背景音乐建议采用采样频率为 22.05KHz/44.1Khz...

wty_118
2015/06/18
4
0
如何用JMF编写MP3音乐播放器1——(图文)如何使用JMF及其环境变量的配置

Java Media Framework JMF,全名为Java Media Framework,它可以在java applet和application中使用音频,视频或者其他基于时间的多媒体。 1.JMF对音频的支持 但是本人经过测试和编写,发现JMF并...

cui314461408
2013/08/09
5.7K
0
Java8 BASE64编解码

Java8 BASE64编解码 Base64是一种用64个字符来表示任意二进制数据的方法。 Base64是一种最常见的二进制编码方法。 Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用第三方的API...

秋风醉了
2015/04/02
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Knowage 6.2安装部署

注意:需要正确配置JAVA_HOME和JRE_HOME还有catalina_home,否则启动的时候tomcat一闪而过,想要获得报错信息,可以打开cmd,在dos命令行运行开始命令 官网:https://www.knowage-suite.com/s...

阿伦哥-
16分钟前
4
0
c++11 左值引用和右值引用

#include <iostream>using namespace std;void Print(string& s){ cout << s;}int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error......

SibylY
18分钟前
3
0
浅谈Facade外观模式

一、前言 外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一...

青衣霓裳
19分钟前
3
0
AnalyticDB for PostgreSQL 6.0 新特性介绍

阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。ADB PG通过行存储、列存...

Mr_zebra
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部