解码一帧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解码器——解码Layer2
相关推荐
纯java实现的MP3解码器,装逼使用,面试使用,很好的实现。
纯java写的解码器 不含任何jar包
java的mp3解码器(非JMF、控制台播放音乐) 用于在你自己的程序中引入,播放MP3文件 运行前先编译---build.bat/build.sh
基于通用可编程GPU的视频编解码器——架构、算法与实现
jmp123是一个解码速度很快的纯JAVA的开源的MP3解码器。在2核2.9G CPU上跑,解码速度达到每秒15000帧以上;在4核 CPU上会跑得更快。
C++实现的Mp3解码器
基于dsp的MP3音频解码程序,可以直接使用,已经调试好。
好不容易找到的,虽然使用matlab实现,但对理解MP3格式很有帮助!
包含三个aac音频解码器,Directshow Filter文件,需要用DirectShow解码AAC音频,试试这几个吧。
1、好用的mp3播放器,可以试试 2、mp3解码器
H.264的三大编解码器之一JM最新版,为VC下C工程源码,可直接使用或二次开发。 文件中包含说明文档
obs解码器视音频推流软件,亲测有效绝对可以用
Huffman编解码问题——讲解.docx
基于STM32的音频解码器.pdf
功能强大的java音频播放器——Beoplayer(附源码),内置多种音频格式的解码器,代码清晰,简单易学,是java处理多媒体技术的必备材料
许多刚接触mina的朋友,对于mina的编解码器的编写很迷惑.希望这个文档可以帮助朋友们少走弯路。 资源中是一个比较典型的编解码器写法。生成了可执行文件。并对编解码器的代码有详细注释。
ASF音频解码器。 从网上下载的一些ASF格式视频没有声音,安装了这个即可解决问题。 譬如清华大学严蔚敏的数据结构视频。
java音频解码
ac3音频解码器,可播放ac3音频格式的视频文件