From 758e06878d8b2966104c4a17da53fe0b1ae8b70a Mon Sep 17 00:00:00 2001 From: 21561 <215613905@qq.com> Date: Sun, 16 Feb 2025 01:13:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B4=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../com/github/tvbox/osc/api/ApiConfig.java | 10 ++++++ .../tvbox/osc/bean/LivePlayerManager.java | 2 +- .../com/github/tvbox/osc/util/HawkConfig.java | 1 + player/build.gradle | 3 +- .../videoplayer/exo/ExoMediaPlayer.java | 32 ++++++++++++++++--- .../videoplayer/exo/ExoMediaSourceHelper.java | 3 +- quickjs/build.gradle | 2 +- 8 files changed, 46 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 851188bb..0d9dc51b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId 'com.github.tvbox.osc' minSdkVersion 16 - targetSdkVersion 26 + targetSdkVersion 28 versionCode 1 versionName '1.0.0' multiDexEnabled true diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index 930570c2..2982f0e1 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -405,6 +405,11 @@ public class ApiConfig { String epg =livesOBJ.get("epg").getAsString(); Hawk.put(HawkConfig.EPG_URL,epg); } + //直播播放器类型 + if(livesOBJ.has("playerType")){ + String livePlayType =livesOBJ.get("playerType").getAsString(); + Hawk.put(HawkConfig.LIVE_PLAY_TYPE,livePlayType); + } LiveChannelGroup liveChannelGroup = new LiveChannelGroup(); liveChannelGroup.setGroupName(url); @@ -422,6 +427,11 @@ public class ApiConfig { String epg =fengMiLives.get("epg").getAsString(); Hawk.put(HawkConfig.EPG_URL,epg); } + //直播播放器类型 + if(livesOBJ.has("playerType")){ + String livePlayType =livesOBJ.get("playerType").getAsString(); + Hawk.put(HawkConfig.LIVE_PLAY_TYPE,livePlayType); + } if(url.startsWith("http")){ url = Base64.encodeToString(url.getBytes("UTF-8"), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); diff --git a/app/src/main/java/com/github/tvbox/osc/bean/LivePlayerManager.java b/app/src/main/java/com/github/tvbox/osc/bean/LivePlayerManager.java index 14484550..dfcd8fbb 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/LivePlayerManager.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/LivePlayerManager.java @@ -22,7 +22,7 @@ public class LivePlayerManager { public void init(VideoView videoView) { try { - defaultPlayerConfig.put("pl", Hawk.get(HawkConfig.PLAY_TYPE, 0)); + defaultPlayerConfig.put("pl", Hawk.get(HawkConfig.LIVE_PLAY_TYPE, 1)); defaultPlayerConfig.put("ijk", Hawk.get(HawkConfig.IJK_CODEC, "硬解码")); defaultPlayerConfig.put("pr", Hawk.get(HawkConfig.PLAY_RENDER, 0)); defaultPlayerConfig.put("sc", Hawk.get(HawkConfig.PLAY_SCALE, 0)); diff --git a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java index 46c56fdc..3cc484da 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java @@ -17,6 +17,7 @@ public class HawkConfig { public static final String PARSE_WEBVIEW = "parse_webview"; // true 系统 false xwalk public static final String IJK_CODEC = "ijk_codec"; public static final String PLAY_TYPE = "play_type";//0 系统 1 ijk 2 exo 10 MXPlayer + public static final String LIVE_PLAY_TYPE = "live_play_type";//0 系统 1 ijk 2 exo 10 MXPlayer public static final String PLAY_RENDER = "play_render"; //0 texture 2 public static final String PLAY_SCALE = "play_scale"; //0 texture 2 public static final String PLAY_TIME_STEP = "play_time_step"; //0 texture 2 diff --git a/player/build.gradle b/player/build.gradle index a9901066..c27ac63b 100644 --- a/player/build.gradle +++ b/player/build.gradle @@ -7,7 +7,7 @@ android { defaultConfig { minSdkVersion 16 - targetSdkVersion 26 + targetSdkVersion 28 } buildTypes { @@ -34,6 +34,7 @@ android { dependencies { implementation "androidx.annotation:annotation:1.3.0" api "com.google.android.exoplayer:exoplayer-core:2.14.2" + api "com.google.android.exoplayer:exoplayer-ui:2.14.2" api "com.google.android.exoplayer:exoplayer-dash:2.14.2" api "com.google.android.exoplayer:exoplayer-hls:2.14.2" api "com.google.android.exoplayer:exoplayer-rtsp:2.14.2" diff --git a/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java b/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java index 5d3de063..8fbba0b2 100644 --- a/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java +++ b/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java @@ -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 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; } diff --git a/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java b/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java index 61f32165..48ed5587 100644 --- a/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java +++ b/player/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java @@ -27,6 +27,7 @@ import java.lang.reflect.Field; import java.util.Iterator; import java.util.Map; +import okhttp3.Call; import okhttp3.OkHttpClient; public final class ExoMediaSourceHelper { @@ -144,7 +145,7 @@ public final class ExoMediaSourceHelper { */ private DataSource.Factory getHttpDataSourceFactory() { if (mHttpDataSourceFactory == null) { - mHttpDataSourceFactory = new OkHttpDataSource.Factory(mOkClient) + mHttpDataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) mOkClient) .setUserAgent(mUserAgent)/* .setAllowCrossProtocolRedirects(true)*/; } diff --git a/quickjs/build.gradle b/quickjs/build.gradle index 0004aaaf..cb648747 100644 --- a/quickjs/build.gradle +++ b/quickjs/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { minSdkVersion 16 - targetSdkVersion 26 + targetSdkVersion 28 externalNativeBuild { cmake { abiFilters 'armeabi-v7a'