Android端HTTPDNS+ExoPlayer最佳实践

更新时间:2025-04-16 05:43:22

1. 背景说明

Media3是谷歌官方推荐的用于打造音频和视频体验的解决方案,它提供一个简单的架构,可基于设备功能进行强大的自定义、可靠性和优化,以消除碎片带来的复杂性,可让 Android 应用显示丰富的视听体验。ExoPlayer 是 Media3 中 Player 接口的默认实现。

ExoPlayer是使用DataSource来读取URI定义的资源数据,从网络读取资源默认是由DefaultHttpDataSource来完成,其内部是使用HttpURLConnection来处理网络请求。此外,ExoPlayer也提供了OkHttp网络库对应的OkHttpDataSource来处理网络请求。

由于OkHttp暴露了自定义DNS服务的接口,通过该接口我们可以优雅地使用HTTPDNS,所以推荐使用OkHttpDataSource

2. 添加OkHttp扩展SDK

您需要根据您使用的ExoPlayer版本来选择对应的OkHttp扩展SDK。

  • 如果您使用的ExoPlayer版本是androix下的media,需要添加下面的依赖项:

implementation "androidx.media3:media3-datasource-okhttp:x.x.x"
说明

OkHttp扩展库的版本请和ExoPlayer SDK的版本保持一致。

如果您使用的ExoPlayer版本是ExoPlayer2,需要添加下面的依赖项:

implementation "com.google.android.exoplayer:extension-okhttp:x.x.x"
说明

OkHttp扩展库的版本请和ExoPlayer SDK的版本保持一致。

3. 使用OkHttp扩展SDK

在初始化ExoPlayer时,使用OkHttp扩展库。

说明

上一部分介绍的两个版本的ExoPlayer,使用OkHttp扩展库的代码是一样的。

Kotlin
Java
val player: ExoPlayer = ExoPlayer.Builder(context)
    .setMediaSourceFactory(
        DefaultMediaSourceFactory(
            OkHttpDataSource.Factory(
                Call.Factory { 
                    //此处clent是OkHttpClient实例,请替换成您项目中的OkHttpClient实例
                    request -> client.newCall(request) 
                })
        )
    )
    .build()
ExoPlayer player = new ExoPlayer.Builder(context)
        .setMediaSourceFactory(new DefaultMediaSourceFactory(new OkHttpDataSource.Factory(new Call.Factory() {
                    @NonNull
                    @Override
                    public Call newCall(@NonNull Request request) {
                        //此处clent是OkHttpClient实例,请替换成您项目中的OkHttpClient实例
                        return client.newCall(request);
                    }
                })))
        .build();

4. 基于OkHttp使用HTTPDNS

最后就是在OkHttp网络库中集成HTTPDNS,具体集成步骤请参考AndroidHTTPDNS+OkHttp最佳实践

  • 本页导读 (0)
  • 1. 背景说明
  • 2. 添加OkHttp扩展SDK
  • 3. 使用OkHttp扩展SDK
  • 4. 基于OkHttp使用HTTPDNS
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等