You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:35:36