为了账号安全,请及时绑定邮箱和手机立即绑定

App增加倍速视频的坎坷之路

标签:
Android

“视频太长太枯燥,要是可以快进播放就好了!”、“这个视频已经看过了,想要快速回顾一下,但是再看1个小时有点久”、“老师发音太快,能不能放慢语速,快跟不上节奏了”

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

图片描述

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

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

    但是遗憾在6.0以下就不支持倍速设置。得益于ExoPlayer可扩展性很强,支持对视频、音频等渲染器做扩展,通过改变默认音频渲染器的音频输出,可以加快音频流的速度,在<span style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; color: rgb(47, 47, 47);">ExoPlayer中,保持音视频同步,一般是视频跟着音频的速率走,所以我们调整音频的速率,就同时也改变了视频。</span>音频流的速率调整可以通过一个三方库Sonic(https://github.com/waywardgeek/sonic/blob/master/Sonic.java)来改变。

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

图片描述

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

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

图片描述

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

图片描述

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

图片描述

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

原文链接:http://www.apkbus.com/blog-39403-75834.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消