|
|
|
|
@ -5,6 +5,8 @@ import android.content.res.AssetFileDescriptor; |
|
|
|
|
import android.view.Surface; |
|
|
|
|
import android.view.SurfaceHolder; |
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
|
|
|
|
|
import com.google.android.exoplayer2.DefaultLoadControl; |
|
|
|
|
import com.google.android.exoplayer2.DefaultRenderersFactory; |
|
|
|
|
import com.google.android.exoplayer2.ExoPlaybackException; |
|
|
|
|
@ -24,8 +26,13 @@ import com.google.android.exoplayer2.util.Clock; |
|
|
|
|
import com.google.android.exoplayer2.util.EventLogger; |
|
|
|
|
import com.google.android.exoplayer2.video.VideoSize; |
|
|
|
|
|
|
|
|
|
import java.net.InetAddress; |
|
|
|
|
import java.net.UnknownHostException; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
import okhttp3.Dns; |
|
|
|
|
import okhttp3.OkHttpClient; |
|
|
|
|
import xyz.doikki.videoplayer.player.AbstractPlayer; |
|
|
|
|
import xyz.doikki.videoplayer.player.VideoViewManager; |
|
|
|
|
import xyz.doikki.videoplayer.util.PlayerUtils; |
|
|
|
|
@ -47,14 +54,32 @@ public class ExoMediaPlayer extends AbstractPlayer implements Player.Listener { |
|
|
|
|
|
|
|
|
|
public ExoMediaPlayer(Context context) { |
|
|
|
|
mAppContext = context.getApplicationContext(); |
|
|
|
|
// 初始化 ExoMediaSourceHelper 实例
|
|
|
|
|
mMediaSourceHelper = ExoMediaSourceHelper.getInstance(context); |
|
|
|
|
// 构造自定义的 OkHttpClient,加入自定义 DNS 逻辑:
|
|
|
|
|
// 当请求的域名以 "cache.ott" 开头时,使用 "base-v4-free-mghy.e.cdn.chinamobile.com" 解析
|
|
|
|
|
OkHttpClient customOkHttpClient = new OkHttpClient.Builder() |
|
|
|
|
.dns(new Dns() { |
|
|
|
|
@Override |
|
|
|
|
public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException { |
|
|
|
|
if (hostname.matches("^cache\\.ott\\..*\\.cmvideo\\.cn$")) { |
|
|
|
|
// 这里将 hostname 强制解析为目标域名
|
|
|
|
|
return Dns.SYSTEM.lookup("base-v4-free-mghy.e.cdn.chinamobile.com"); |
|
|
|
|
} |
|
|
|
|
return Dns.SYSTEM.lookup(hostname); |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
.build(); |
|
|
|
|
// 注入自定义 OkHttpClient 到 ExoMediaSourceHelper 中
|
|
|
|
|
mMediaSourceHelper.setOkClient(customOkHttpClient); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void initPlayer() { |
|
|
|
|
mInternalPlayer = new SimpleExoPlayer.Builder( |
|
|
|
|
mAppContext, |
|
|
|
|
mRenderersFactory == null ? mRenderersFactory = new DefaultRenderersFactory(mAppContext) : mRenderersFactory, |
|
|
|
|
mRenderersFactory == null ? mRenderersFactory = new DefaultRenderersFactory(mAppContext).setEnableDecoderFallback(true) // 启用解码器回退,避免硬件加速问题
|
|
|
|
|
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) : mRenderersFactory, |
|
|
|
|
mTrackSelector == null ? mTrackSelector = new DefaultTrackSelector(mAppContext) : mTrackSelector, |
|
|
|
|
new DefaultMediaSourceFactory(mAppContext), |
|
|
|
|
mLoadControl == null ? mLoadControl = new DefaultLoadControl() : mLoadControl, |
|
|
|
|
@ -63,7 +88,7 @@ public class ExoMediaPlayer extends AbstractPlayer implements Player.Listener { |
|
|
|
|
.build(); |
|
|
|
|
setOptions(); |
|
|
|
|
|
|
|
|
|
//播放器日志
|
|
|
|
|
// 播放器日志(当开启日志且 mTrackSelector 为 MappingTrackSelector 时)
|
|
|
|
|
if (VideoViewManager.getConfig().mIsEnableLog && mTrackSelector instanceof MappingTrackSelector) { |
|
|
|
|
mInternalPlayer.addAnalyticsListener(new EventLogger((MappingTrackSelector) mTrackSelector, "ExoPlayer")); |
|
|
|
|
} |
|
|
|
|
@ -90,7 +115,7 @@ public class ExoMediaPlayer extends AbstractPlayer implements Player.Listener { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void setDataSource(AssetFileDescriptor fd) { |
|
|
|
|
//no support
|
|
|
|
|
// 不支持AssetFileDescriptor方式
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -167,7 +192,6 @@ public class ExoMediaPlayer extends AbstractPlayer implements Player.Listener { |
|
|
|
|
mInternalPlayer.release(); |
|
|
|
|
mInternalPlayer = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mIsPreparing = false; |
|
|
|
|
mSpeedPlaybackParameters = null; |
|
|
|
|
} |
|
|
|
|
|