前言: 众所周知,android系统本身audio系统仅支持16bit采样精度及44.1KHZ采样频率。就是48KHZ的采样率也是经过android重采样过的,对于一般用户,这也许已经足够了,但对于HIFI级别来说。还有很大的提升空间,一个HIFI播放器,采样精度要到24bit,甚至32bit,采样频率要到192KHZ/177.6HZ。才是HIFI者们追求的目标。而原生android系统是无法做到。就算市面上热卖的所谓HIFI android手机,实际上也都是仅仅支持高码率解码,而标准码率输出,也就是说,虽说这些HIFI 手机能够播放24bit,192KHZ的语音文件。但实际上在播放的时候也是做了重采样,衰减到16bit,44,1KHZ了,为何?原因无他,android系统决定的。 一 android audio系统: Android 的Audio系统这里不累赘,网上大把。这里介绍做HIFI播放器的几个关键地方。在原生的android系统中,有一个叫做StagefrightPlayer的默认播放器,基于omx框架。如果我们要做HIFI播放器的解码,也就是在这个地方做一个更它同等的播放器,以4.2为例。StagefrightPlayer位于frameworks/av/media/libmediaplayerservice/。那如何切换系统默认的StagefrightPlayer,到我们自己的HIFIPlayer。注意下frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp 。这个文件就是预先解析内容,寻找在合适的player。这里不多介绍,大家仔细看看,相信都能看明白。 二 android hifi播放器: 我们需要在 mediaplayerservice 这里添加自己的hifiplayer,要实现接口MediaPlayerInterface 这里我们的hifiplayer就需要一个关键性东西了 解码器。我们经常说到的无损音乐,如ape flac等。如何解码,这里就需要大名鼎鼎的ffmpeg了。Ffmpeg不了解?请自行百度。如何通过ffmped捣鼓出自己的解码器呢?这个就是需要一定的工作量了。首先请到ffmpeg下载源码 :http://ffmpeg.org/download.html#releases 最好不要选择过旧的版本。1.2以上就可以了。然后编译生成可执行的ffmpeg和ffplay,然后呢?就是自己研究ffmpeg了 。Ffmpeg 可以解码编码多种格式,ffplayer 直接就是个播放器了。 下面的工作就是将需要的无损格式的解码抽离出来。做一个自己的hifiplayer。其实就是基于ffplayer做剪裁了。可参考 extern/ffmpeg 。三 音频流处理。 Android用来播放pcm的 AudioTrack类。之后混音重采样都在这里面进行。如果我们要实现高码率(24bit。192khz)就必须饶过AudioTrack,那倒了哪里呢》就到了alsa_aplay这里。Android还自带一个tinyplay 其实都是很类似的,这里就到了硬件抽象层了。 四 驱动ALSA Android 的音频驱动是基于ALSA的,驱动依据不同厂家是不一样的,驱动这里主要修改2个地方 PCM 与I2S 。本平台主要修改以下两个文件:rk29_pcm.c 与rk30_i2s.c 注意修改PCM驱动I2S驱动的采样精度与频率的支持参数。最后要做的就是coedec芯片驱动了。这个根据具体选择的codec芯片了 五 绕过audiotrack带来的问题。 由于绕过了audiotrack,也就没有了android系统的音频流处理,没有了重采样,没有的混音,android的audio efftct也没有作用了,最关键的是没有了混音,也就是说 在播放无损音乐时 ,按钮没声音了,原因是tinyalsa是对声音硬件独占了。没有释放硬件资源 系统使用的alsa_aplay在来申请硬件时 就申请不到了。没有完美的解决办法。那就只有在播放无损音乐时,禁止掉所有的系统声音了。另一个问题:没有频谱,音效?这个只能自己添加,怎么加?当然还是万能的ffmpeg。 注:本文所述方式经过笔者验证,并已有实际产品。若有疑问请留言。 |