Android端HTTPDNS+ExoPlayer接入指南

背景信息

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

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

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

添加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的版本保持一致。

使用OkHttp扩展SDK

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

说明

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

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();

使用HTTPDNS

最后就是在OkHttp网络库中集成HTTPDNS,具体集成步骤请参考Android端HTTPDNS+OkHttp接入指南