本文纯属蛋疼,实现一个可以拖动,选择需要播放的时间段,然后播放效果是只播放这一段选中的音乐。
- 需求:自定义一个Android播放器
- 可以随意选择需要播放音乐片段
- 返回选中播放部分的音乐数据
- 分析:
- MediaPlayer 肯定是实现不了了,使用AudioTrack
- 需要可以选择播放的音乐片段,需要界面的支持,至少需要一个可以双向选择的SeekBar,感谢前辈的支持
- 需要返回选中部分的音乐数据,返回的数据是byte[],可以选择之间返回一堆byte数组,可以写入缓存文件,然后返回缓存文件,接收方再从文件里读取;推荐第二种方式,更灵活一点,还可以自定义文件头,方便传递诸如SampleRate,ChannelCount等等参数,直接传一堆数组,如果选择播放区域很大,很吃内存。
- 实现:
- 感谢感谢,双向选择的SeekBar的问题顺利解决,当然也可以自己实现,但这个不是现在的主要矛盾
- 使用AudioTrack 播放音乐, AudioTrack需要自己循环写入数据,这种耗时操作最好在线程里操作。
- 想要实现那种边边播放边解码,解码音乐需要开一个线程,播放时新开一个线程,但是这里有个问题,如果已经全部解码完,就没有问题了,用户可调整的SeekBar,min:0,max:解码出来的数据长度,然后用户拖到那里,就获取那部分数据播放,但是没有解码完成,max位置时一一直在变化的,此时用户如果拖动,就有问题了,开始解码音乐时,可以获取到音乐的总时长,如何把时长加进来,用户可见的时调整播放时间,处理时通过这个时间来找到对应的数据
- 如何解决上面的问题,同时不能太占用内存,依旧使用RandomAccessFile存储获取到的文件,对文件进行一个处理,新增一个文件或者列表,标示某一秒内,对呀哪些音乐数据。
- 最后实现的效果,基本可以做到拖动播放起点,播放该时间点的音乐
- 附上 1.0源码 如果想直接下载源码成功运行,需要在手机根目录下放一个“test.mp3“的音乐文件
-
测试界面很简洁,原谅我放荡不羁爱*