1

课程视频越来越长,学习时间越来越少。面对这些场景,很多视频播放的App都增加了倍速功能,可以开启0.5x、1.5x甚至2.0x等倍速,用于增强播放功能。 iOS系统播放内核的强大,很轻松的应付了产品经理提出的这个需求,但是面对市场上数不清的Android系统版本和设备,这让Android客户端增加倍速功能,无疑又新添了一道门坎。

clipboard.png

        为了增加倍速功能,并保持系统版本兼容,一开始选择的是集成vlc播放器的方案。vlc 2.x版本后,增加了倍速播放功能,但vlc本身结构比较庞大,集成难度较高,增加了后续维护的难度,在使用一段时间后,开始考虑给Android端更换另外一种倍速方案。

        这次是集成Google ExoPlayer的播放器,ExoPlayer本身在Android 6.0系统及以上,支持系统级别的倍速播放功能,能更好的利用设备硬件功能。ExoPlayer本身出自Google之手,是官方推荐的播放器,对Android系统兼容较好,并且设计结构简单易懂,容易扩展。

       但是遗憾在6.0以下就不支持倍速设置。得益于ExoPlayer可扩展性很强,支持对视频、音频等渲染器做扩展,通过改变默认音频渲染器的音频输出,可以加快音频流的速度,在ExoPlayer中,保持音视频同步,一般是视频跟着音频的速率走,所以我们调整音频的速率,就同时也改变了视频。音频流的速率调整可以通过一个三方库Sonic(https://github.com/waywardgee...)来改变。

        当播放器进行构建音频渲染器的时候,可以根据Android系统版本选择不同的音频渲染器。当Android系统是6.0及以上时,我们使用默认的MediaCodecAudioRenderer,6.0以下时,就使用自定义的音频渲染器SonicMediaCodecAudioTrackRenderer。
       
clipboard.png

        SonicMediaCodecAudioTrackRenderer的核心,就是拿到音频流的buffer,使用Sonic对这段buffer数据流进行速率调整处理,然后把调整后的buffer流送给音频渲染器,这样就更改了音频速率。
       
clipboard.png

        SonicMediaCodecAudioTrackRenderer本身也继承至MediaCodecAudioRenderer类,在onOutputFormatChanged方法里,我们初始化Sonic和一些缓存buffer数组,并配置速率。

        processOutputBuffer方法会在音频渲染器工作的时候被调用,在这里使用Sonic来改变原始的音频流buffer数据,并把转换后的流buffer传递给播放器播放。
       
clipboard.png

        在Android 6.0的系统上,我们只要给默认的MediaCodecAudioRenderer渲染器配置PlaybackParams参数就可以实现倍速播放了。
       
clipboard.png

        至此,完成了ExoPlayer对倍速功能的支持,并兼容到了多个Android系统版本。在集成到Android项目中,无论从代码耦合结构,还是播放器扩展性、易读性,ExoPlayer无疑比vlc更具优势。
       
欢迎加入学习交流群569772982,大家一起学习交流。


java部落
90 声望13 粉丝