ExoPlayer播放已下载DRM HLS视频报UnrecognizedInputFormatException异常
问题原因
这是ExoPlayer离线DRM适配场景的高频共性问题,触发根因如下:
你之前下载的存量无DRM HLS视频的本地m3u8 manifest是明文存储,但新版本播放时直接复用了开启DRM支持的DefaultHttpDataSourceFactory,该工厂生成的DataSource会默认对所有读取的流走DRM解密流程,明文的m3u8内容经过解密逻辑处理后变成乱码,导致HlsPlaylistParser无法识别到开头的#EXTM3U头,就抛出了你遇到的格式不兼容异常。
部分ExoPlayer版本的DefaultHttpDataSource开启DRM配置后,对本地文件流的场景判断存在缺陷,会错误将本地离线资源识别为在线DRM资源,强制触发license校验和解密逻辑,也会破坏原文件的二进制结构导致该报错。
修复方案
- 离线播放场景不要复用在线侧带DRM配置的
DefaultHttpDataSourceFactory,单独为离线播放创建无DRM配置的DefaultDataSource.Factory来读取本地文件流 - 如果需要同时支持离线DRM和非DRM视频播放,在初始化DataSourceFactory前先读取本地离线视频的DRM元数据标记,存量无DRM的视频走普通DataSource,带DRM的离线视频走对应DRM配置的DataSource
- 如果你用ExoPlayer官方Downloader框架下载视频,可以在下载时给每个
DownloadRequest添加自定义DRM标识字段,播放时优先读取该标识再选择匹配的DataSourceFactory - 快速验证方案:可以在抛出异常时将当前读取的本地流dump到本地文件,查看文件开头是否为乱码、没有
#EXTM3U字段,即可快速定位是否是该问题
内容的提问来源于stack exchange,提问作者Neelu Agrawal
相关产品推荐
相关产品推荐

