音频硬解码方案之利用第三方jar--JLayer(For Android & java)

  最近在做一款关于音频的App应用程序,花了一部分时间学习了很多相关知识,今天给大家带来一个利用第三方jar(JLayer)包对MP3进行硬解码的方案(关于什么是硬解码什么是软解码,百度google自己查,我在这里就不详细说了。而关于采用软解码还是硬解码,主要取决于你的项目和你的功能需要怎样处理,所有选择什么,主要还是取经于你要干什么)。

    JLayer的功能包括了转换器、解码器、播放器等,大家有兴趣可以自己看下文档。我只用到了解码器,也就是Decode部分,是一种硬解码。所有就给大家只介绍这部分。(Note:经过我测试,对于MP3音频的解析,JLayer仅仅只支持采样率44000 & 双声道,所以,如果你的项目如果MP3格式不确定,JLayer无法给你带来更多帮助。对于VBR(动态比特率)和CBR(静态比特率)没有要求。关于一些相关名词,请大家自己去了解,或者后续我写一遍关于音频术语的粗略介绍),废话说道这里,项目直接开始:

    1、到相关地址下载相关文件http://www.javazoom.net/javalayer/javalayer.html(公众号不支持第三方链接)

2、android studio导入第三方jar包(这些基础就不在一一演示了,相信大家都没有问题)’

3、’下面是代码 我借鉴了这篇文章,以下是解码原文,地址我也给出大家

http://mindtherobot.com/blog/624/android-audio-play-an-mp3-file-on-an-audiotrack/


音频硬解码方案之利用第三方jar--JLayer(For Android & java)_第1张图片

note:其中有几个很关键的地方我也记录下来:给大家排坑。decode会有顺序的返回一些short[]数据组,这就是PCM源数据。 s&0xff  为取s的低八位  。(s>>8) &0xff 为取s的高八位,若不加括号,运算顺序会错误哦,请注意。这里为什么怎么做?前面为什么用short? 这里必须强调一点,我们的目的是把MP3转成PCM(MP3为压缩音频,PCM是纯数据,(这里多说一句,关于PCM和WAV的区别,请自行查找,很简单),下边这个文章是对PCM格式一个很好的分析:

http://blog.csdn.net/ownwell/article/details/8114121/


音频硬解码方案之利用第三方jar--JLayer(For Android & java)_第2张图片

我们可以很明显知道,16位我们需要两个字节来存储,在上面代码中,就是一个很好的把16位分成两个字节来存储到计算机中,低高、低高、低高、、、依次存储。这是一种小尾端的存储方式。当然也有高低、高低、、、存储方式(什么是大尾端,什么是小尾端?)

最后通过ByteArrayOutputStream一次性把所有解析到的数据全部吐出。

    关于怎么计算播放时间的,如果你很好的理解采样率,就不难了。

4、最后利用android 自带的AudioTrack就可以播放了。android 目前我知道的有三种播放音乐的类,除了最常用的MediaPlayer外,还有这个AudioTrack。AudioTrack只支持PCM纯数据(byte[] 、short[]、float[]三种方式都可以,本人亲测了btye和short,都可以直接播放。大家可以把上边返回的short[]直接存在一起,直接丢给AudioTrack播放,也是可以的).还有就是soundPool也能播放音乐。

    小结:通过这种方式,我们可以很轻松的实现对特定格式MP3转PCM,及在android中利用自带的AudioTrack进行播放。这种方式的优点是它没有用到底层代码,只是对MP3格式进行分析,优势就在于解析速度快。缺点是如果我们的MP3是单声道,或者不是采样率不是44000,解析出来的数据就是有问题的。针对不同采样率和声道数,我们应该怎么做,这个时候我们就不得讲其他解析方式了,android自带的MediaCodec来进行硬解析了。敬请关注

你可能感兴趣的:(音频硬解码方案之利用第三方jar--JLayer(For Android & java))