受DRM保护的离线视频ExoPlayer 2x倍速播放时三星A7平板卡顿
问题根因定位
- 你使用的ExoPlayer 2.10.2版本存在缓存读取性能缺陷,
CacheDataSource默认单次读取块大小仅为64KB,2倍速播放时需要频繁发起IO请求,叠加三星A7平板的存储IO性能一般、DRM解密的额外开销,很容易出现数据供给跟不上播放速度的卡顿问题 - 在线播放时
DefaultHttpDataSource默认绑定了带宽计量器,会自动根据网速调整缓冲区大小,掩盖了底层的配置缺陷,所以卡顿不明显 - 你当前的离线数据源配置没有针对高倍速、DRM场景做参数优化,默认缓冲区大小不足以支撑2倍速下的解密+播放需求
修复方案
1. 优化缓存数据源配置
替换你现有的cacheDataSourceFactory初始化逻辑,调整缓存读取参数减少IO次数:
// 适配2.10.2版本的CacheDataSourceFactory配置 cacheDataSourceFactory = CacheDataSourceFactory( cache, factory, FileDataSource.Factory().apply { // 设置单次最小读取2MB,降低IO请求频率 setMinReadSize(2 * 1024 * 1024) }, CacheDataSource.FLAG_BLOCK_ON_CACHE or CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR )
2. 调整播放器缓冲区策略
自定义LoadControl,调高高倍速场景下的预加载阈值:
val customLoadControl = DefaultLoadControl.Builder() .setMinBufferMs(5000) // 最小预加载5秒内容 .setMaxBufferMs(30000) // 最大预加载30秒内容 .setBufferForPlaybackMs(1000) .setBufferForPlaybackAfterRebufferMs(2000) .setPrioritizeTimeOverSizeThresholds(true) .build() // 初始化播放器时传入自定义LoadControl val exoPlayer = ExoPlayerFactory.newSimpleInstance( context, DefaultRenderersFactory(context), DefaultTrackSelector(), customLoadControl )
3. 适配三星设备DRM解码
强制优先使用硬件解码器,降低DRM解密后的软解码开销:
val renderersFactory = DefaultRenderersFactory(context) .setEnableDecoderFallback(true) // 优先硬件解码,针对三星DRM适配优化 .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
如果以上修改后卡顿仍存在,建议升级ExoPlayer到2.18及以上版本,2.10.2版本存在多个三星设备DRM播放的已知兼容bug,后续版本已做针对性修复。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

