最近在做一个android平台上的音乐播放器,没什么创新的地方,就是练习练习MediaPlayer的使用,但不用不知道,一用吓一跳。原来在MediaPlayer中还有很多我不了解的东西。
一些普通的关于MediaPlayer的状态啊,函数调用啊这些在这里就不再阐述了,下面重点讲解一下我所遇到的问题。
在测试播放器的时候,我所使用的在线播放资源是32位的,网络环境为wifi。经测试,2.1,2.2,2.3.0,上缓冲能很快完成,但在2.3.3,2.3.4上,缓冲时间就变得很长了,大约要一分半钟,很难接受。既然做了,就探究到底,到底是什么原因呢?同样的网络环境,同样的代码....后来,我换用128位的播放资源,发现2.3.3和2.3.4的时间明显变短了,大概只要15秒左右。顿时,我觉得有点眉目了。
从我的认知范围来讲,MediaPlayer的Prepare在线播放时,读取网络资源,他也不知道缓冲到什么时候才结束,所以我认为他应该是缓冲到一定数量的数据的时候才完成Prepare,从而跳到Prepared状态。从这里很容易解释为什么128位资源反而比32位资源缓冲时间短,因为在网络带宽允许下,128位资源在一个频率下载的数据是32位的四倍,对于固定的缓冲区大小,要填满缓冲区,时间就变为32位的四分子一了。
那么,要缩短2.3.3的缓冲时间有什么办法呢?很自然,我们想到要缩小缓冲区的大小,那我们就得研究一下MediaPlayer的Prepare代码了。我从这里看到
public native void Prepare();
public native void PrepareAsync();
这两个方法,他们是Native方法,调用的已经交叉编译好的C语音库文件(关于android的Jni我也不是太熟悉)。
看到这,我也有点迷茫,不知如何处理。但提出解决思路:
利用android NDK开发,找到MediaPlayer一块的C代码,然后重写Prepare一块的缓冲区大小,在Java源程序中调用自己重写过的库文件。
这样也许就行了,但我也只是思考,没具体实现过。准备过两天写一下。