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

(一)用JAVA编写MP3解码器——前言

阅读更多

  【内容提要】 《用JAVA编写MP3解码器》系列文章将对JAVA实现MP3解码的技术细节作介绍,本着开源的精神,文中给出完整的MPEG 1.0/2.0/2.5 Audio Layer I/II/III 解码的JAVA源代码。在哈夫曼解码、逆量化和重排序、多相合成滤波等模块中采用了卓有成效方法来提高程序运行效率;采用了IMDCT、DCT经典的快速算法,根据自己对算法的理解编写代码,对快速算法有详细的推导和说明;整个程序采用模块化设计,程序结构比较清晰。即使你之前对JAVA语言不太熟悉,由于JAVA的语法类似于C语言,也是很容易看懂的。

  对解码规范理解不到位导致的错误和疏漏之处再所难免,欢迎批评指正。

 

  【许可协议】   文中给出的MPEG 1.0/2.0/2.5 Audio Layer I/II/III 解码的JAVA源代码是一个自由软件,你可以重新发布和(或)修改,必须遵守GPL v3.0(GNU Lesser General Public License version 3)协议。发布这一程序的目的是希望它有用,但不提供任何担保;甚至不包括用于商业的和为特殊目的在内的任何保证。你可以从“ GNU公用通用许可3.0版 ”或者通过阅读本文附件中的GPLv3.txt中找到更多细节。

 

  【文件下载】   请到 http://sourceforge.net/projects/jmp123/files/ 下载源码。

 

  【目录】 《用JAVA编写MP3解码器》系列共18篇,每篇的第一个网址是本站论坛,第二个是我的博客。

 

(一)用JAVA编写MP3解码器——前言
http://www.iteye.com/topic/739585

http://lfp001.iteye.com/blog/739585

 

(二)用JAVA编写MP3解码器——帧头信息解码
http://www.iteye.com/topic/739606

http://lfp001.iteye.com/blog/739606

 

(三)用JAVA编写MP3解码器——读取位流
http://www.iteye.com/topic/739678

http://lfp001.iteye.com/blog/739678

 

(四)用JAVA编写MP3解码器——读取文件
http://www.iteye.com/topic/740090

http://lfp001.iteye.com/blog/740090

 

(五)用JAVA编写MP3解码器——解析文件信息
http://www.iteye.com/topic/740930

http://lfp001.iteye.com/blog/740930

 

(六)用JAVA编写MP3解码器——帧数据结构
http://www.iteye.com/topic/741558

http://lfp001.iteye.com/blog/741558

 

(七)用JAVA编写MP3解码器——解码帧边信息
http://www.iteye.com/topic/742913

http://lfp001.iteye.com/blog/742913

 

(八)用JAVA编写MP3解码器——解码增益因子
http://www.iteye.com/topic/743318

http://lfp001.iteye.com/blog/743318

 

(九)用JAVA编写MP3解码器——哈夫曼解码
http://www.iteye.com/topic/744000

http://lfp001.iteye.com/blog/744000

 

(十)用JAVA编写MP3解码器——逆量化和重排序
http://www.iteye.com/topic/744417

http://lfp001.iteye.com/blog/744417

 

(十一)用JAVA编写MP3解码器——立体声处理
http://www.iteye.com/topic/746850

http://lfp001.iteye.com/blog/746850

 

(十二)用JAVA编写MP3解码器——消混叠处理
http://www.iteye.com/topic/748157

http://lfp001.iteye.com/blog/748157

 

(十三)用JAVA编写MP3解码器——IMDCT快速算法
http://www.iteye.com/topic/749785

http://lfp001.iteye.com/blog/749785

 

(十四)用JAVA编写MP3解码器——多相合成滤波
http://www.iteye.com/topic/749974

http://lfp001.iteye.com/blog/749974

 

(十五)用JAVA编写MP3解码器——音频输出
http://www.iteye.com/topic/750060

http://lfp001.iteye.com/blog/750060

 

(十六)用JAVA编写MP3解码器——解码Layer2
http://www.iteye.com/topic/750070

http://lfp001.iteye.com/blog/750070

 

(十七)用JAVA编写MP3解码器——解码Layer1
http://www.iteye.com/topic/750076

http://lfp001.iteye.com/blog/750076

 

(十八)用JAVA编写MP3解码器——迷你播放器
http://www.iteye.com/topic/751013

http://lfp001.iteye.com/blog/751013

 

【附】无论用什么样的编程语言,编写出MPEG 1.0/2.0/2.5音频解码器是不难的;编写出兼顾速度和存储开销的高效的解码器是很难的。

      我所知道的解码器,解码结果没有区别,不同的是效率问题。有人对不同的播放器作出这样的主观听感上不同评价:柔和、甜美、声音发干、偏冷等。这样的评价是值得商榷的,如果解码器是开源的,调试运行可以直接看到解码最后一步送入音频硬件的PCM数据,如果解码器不是开源的,可以编程抓取其PCM数据出来看,我测试几个解码器的结果是没的区别的。解码中间过程的计算误差是存在的,不同的解码器对同一输入解码出的中间结果(float/double类型)不同,经过最后一步乘上32767再取整得到16位整型的PCM,不同的解码器对同一输入结果就是相同的了,包括最古老的Xing MP3解码器和最新的MPG123、LIBMAD。所以不要担心你美妙的歌曲被解码器折腾得不动听了,如果追求好的音质,用专业的声卡配高品质的音箱才行。

      控制台程序运行屏幕截图:

 

下一篇:(二)用JAVA编写MP3解码器——帧头信息解码

  • 大小: 3.4 KB
分享到:
评论
28 楼 continentlu 2012-08-31  
太感谢了。
27 楼 windyer39 2012-06-07  
果断mark 大神
26 楼 dxqrr 2011-11-17  
先mark
25 楼 sasuke38 2011-11-06  
音质真的太好了  系统资源占用也不高
24 楼 lfp001 2011-10-24  
thirdthk 写道
楼主您好,我最近在看mp3的解码,在网上也找了很多资料,现在在一点一点看楼主的程序,但是我发现我从网上找的一些资料都不够详细,我想问下楼主当时在写这个mp3解码程序的时候参考的资料哪弄的,也是网上搜的吗?这方面的详细的权威资料哪里弄啊


MP3解码请参考国际标准iso/iec11172-3和iso/iec13818-3
23 楼 thirdthk 2011-10-21  
楼主您好,我最近在看mp3的解码,在网上也找了很多资料,现在在一点一点看楼主的程序,但是我发现我从网上找的一些资料都不够详细,我想问下楼主当时在写这个mp3解码程序的时候参考的资料哪弄的,也是网上搜的吗?这方面的详细的权威资料哪里弄啊
22 楼 MO_oC 2010-09-28  
你给的批处理不支持有空格的文件路径,我改了下

@echo off
echo JAVA mini MPEG 1.0/2.0/2.5 Layer I/II/III Player v0.0.1 ly2697@sina.com 2009-4
echo.
rem ########################设置路径#############################
set mp3path="E:\Media Go\音乐\楊丞琳"

set df="%mp3path:~1,-1%\%%a"
for /f "delims=\" %%a in ('dir %mp3path%\*.mp3 /b') do @echo 正在播放:%df% & java -jar jmp123.jar %df% & echo.
@echo on
21 楼 MO_oC 2010-09-28  
if ((len + intBuffSize) > (byteBitReservoir.length-4)) move();

OK了 
20 楼 lfp001 2010-09-28  
<div class="quote_title">MO_oC 写道</div>
<div class="quote_div">这首歌听到1分09秒的时候会出错哦 http://upwap.ru/1052697</div>
<p><br><span style="font-size: medium;">这是源代码中的一个<strong><span><span style="color: red;">bug</span></span></strong></span><span style="font-size: medium;">所致。解决方法:打开jmp123.decoder包下的BitStream.java找append(int len)方法,将该方法内的byteBitReservoir.length改为4092就OK了。byteBitReservoir长度为4096字节,要确保尾部留出4字节。下载源码自己DIY哈。我正在整理源码,才整理到1/3左右,抽空整理完了再传上去。</span></p>
<p><span style="font-size: medium;">你的这首歌不错~~</span></p>
19 楼 MO_oC 2010-09-28  
这首歌听到1分09秒的时候会出错哦 http://upwap.ru/1052697
18 楼 lfp001 2010-09-27  
MO_oC 写道
楼主,为什么用SVN下载不了你的源码?
https://jmp123.svn.sourceforge.net/svnroot/jmp123
这个地址里面是空的

源码还要整理一下,MP3解码器部分没的什么大问题了,以前作过比较全面的测试。一些辅助功能模块可能要作比较大的改动,等我把源码修改好了传上去,再去服务器设置SVN。
17 楼 lfp001 2010-09-27  
ini_always 写道
请问下楼主,能不能给解释下mp3文件的具体构成格式,或者,能不能给提供点这方面的资料?谢谢。

在http://jmp123.sf.net/下载MP3的国际标准ISO/IEC 11172-3。
16 楼 zxlsky1314 2010-09-25  
只能说顶了!
15 楼 MO_oC 2010-09-25  
楼主,为什么用SVN下载不了你的源码?
https://jmp123.svn.sourceforge.net/svnroot/jmp123
这个地址里面是空的
14 楼 enefry 2010-09-22  
打包收藏
感谢楼主开源.
13 楼 ini_always 2010-09-20  
请问下楼主,能不能给解释下mp3文件的具体构成格式,或者,能不能给提供点这方面的资料?谢谢。
12 楼 xietingyan 2010-09-18  
楼主我真的爱死你了!
11 楼 lfp001 2010-09-16  
MO_oC 写道
请问楼主,能否加入波形图的显示

现在的还是测试版,是命令行的播放器,先把解码过程再回头过去仔细看一下,等解码过程调试正确之后再写GUI,那时再附加这些功能上去。
10 楼 MO_oC 2010-09-16  
请问楼主,能否加入波形图的显示
9 楼 ini_always 2010-09-11  
先顶一个,然后再慢慢看楼主的系列,楼主对音频的一些规范理解太深了!

相关推荐

Global site tag (gtag.js) - Google Analytics