ExoPlayer r1.5.12迁移至2.7.3:ExtractorSampleSource替代类及数据源复用咨询
ExoPlayer r1.5.12 → 2.7.3 升级适配指南
刚好我对ExoPlayer的版本迭代细节比较熟悉,针对你的问题梳理下适配要点:
1. ExtractorSampleSource的替代类
在2.x系列(包括2.7.3)里,ExtractorSampleSource已经被**ExtractorMediaSource**完全替代了。这个类是2.x中处理MP3这类基于提取器的媒体源的核心组件,用法逻辑和旧版类似,但API结构更规整,和新的ExoPlayer实例创建流程更契合。
2. 自定义myDataSource的复用方案
你的myDataSource是可以复用的,但需要做一点小适配:
- 旧版的
UriDataSource接口在2.x里对应DataSource接口,如果你的myDataSource原来实现的是UriDataSource,只需要把接口换成DataSource就行——核心的open、read、close这些方法的逻辑完全可以直接复用,只是方法参数会变成DataSpec(替代原来的Uri),处理起来很简单。 - 之后要把它包装成
DataSource.Factory,这样才能给ExtractorMediaSource提供数据源实例,这是2.x的标准用法。
3. 适配后的完整代码示例
把你原来的代码改成2.7.3版本的写法大概是这样:
// 创建ExoPlayer实例(2.x的标准创建方式) int rendererCount = 1; ExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(context, new DefaultTrackSelector()); // 检查目标MP3文件是否存在 File file = new File(getCacheDir(), "sample.mp3"); if (!file.exists()) { // 这里加文件不存在的处理逻辑,比如提示用户 return; } // 把自定义myDataSource包装成DataSource.Factory DataSource.Factory dataSourceFactory = new DataSource.Factory() { @Override public DataSource createDataSource() { return new myDataSource(); // 这里传入你的自定义DataSource实例,记得先适配2.x的DataSource接口 } }; // 用ExtractorMediaSource替代旧的ExtractorSampleSource Uri fileUri = Uri.fromFile(file); MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory) .createMediaSource(fileUri); // 准备并开始播放 exoPlayer.prepare(mediaSource); exoPlayer.setPlayWhenReady(true);
额外提醒
- 2.x版本的生命周期管理(比如释放播放器、暂停播放)和旧版差别不大,但建议使用
Player.EventListener来监听播放状态变化,这是2.x的规范用法。 - 如果你的
myDataSource有自定义的流处理逻辑,只需要在open(DataSpec)方法里正确解析传入的DataSpec获取流信息就行,其他读写逻辑完全可以照搬旧代码。
内容的提问来源于stack exchange,提问作者ery245gs
相关产品推荐
相关产品推荐

