From e0e8a0f8d2d4ad5733d50b3626174b5cefd76681 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 24 Nov 2022 09:24:41 +0800 Subject: [PATCH 1/6] Update Players.java --- .../com/fongmi/android/tv/player/Players.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 0e659fefe..aa767fe42 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -256,21 +256,17 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM private void setMediaSource(Result result) { SpiderDebug.log(errorCode + "," + result.getUrl() + "," + result.getHeaders()); if (isIjk()) ijkPlayer.setMediaSource(result.getPlayUrl() + result.getUrl(), result.getHeaders()); - else if (isExo()) { - exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode)); - exoPlayer.prepare(); - PlayerEvent.state(0); - } + if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode)); + if (isExo()) exoPlayer.prepare(); + PlayerEvent.state(0); } private void setMediaSource(Map headers, String url) { SpiderDebug.log(errorCode + "," + url + "," + headers); if (isIjk()) ijkPlayer.setMediaSource(url, headers); - else if (isExo()) { - exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode)); - exoPlayer.prepare(); - PlayerEvent.state(0); - } + if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode)); + if (isExo()) exoPlayer.prepare(); + PlayerEvent.state(0); } @Override @@ -303,9 +299,6 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM @Override public boolean onInfo(IMediaPlayer mp, int what, int extra) { switch (what) { - case IMediaPlayer.MEDIA_INFO_AUDIO_DECODED_START: - PlayerEvent.state(0); - return true; case IMediaPlayer.MEDIA_INFO_BUFFERING_START: PlayerEvent.state(Player.STATE_BUFFERING); return true; From efd2e0803a81597e20c5c1528eb840d73bae338a Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 24 Nov 2022 09:34:04 +0800 Subject: [PATCH 2/6] Update IjkVideoView.java --- .../ijk/media/player/ui/IjkVideoView.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index e06aee75c..f3d29a468 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -50,6 +50,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl private float mCurrentSpeed = 1; private int mCurrentAspectRatio; private int mCurrentRender; + private int mStartPosition; private int mCurrentState = STATE_IDLE; private int mTargetState = STATE_IDLE; @@ -266,9 +267,15 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl if (mOnInfoListener != null) { mOnInfoListener.onInfo(mp, what, extra); } - if (what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED) { - mVideoRotationDegree = extra; - if (mRenderView != null) mRenderView.setVideoRotation(extra); + switch (what) { + case IMediaPlayer.MEDIA_INFO_AUDIO_DECODED_START: + if (mStartPosition > 0) seekTo(mStartPosition); + mStartPosition = 0; + break; + case IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED: + mVideoRotationDegree = extra; + if (mRenderView != null) mRenderView.setVideoRotation(extra); + break; } return true; } @@ -420,14 +427,15 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl } @Override - public void seekTo(int msec) { + public void seekTo(int positionMs) { if (!isInPlaybackState()) return; mInfoListener.onInfo(mIjkPlayer, IMediaPlayer.MEDIA_INFO_BUFFERING_START, 0); - mIjkPlayer.seekTo(msec); + mIjkPlayer.seekTo(positionMs); } - public void seekTo(long msec) { - seekTo((int) msec); + public void seekTo(long positionMs) { + mStartPosition = (int) positionMs; + seekTo(mStartPosition); } public void setSpeed(float speed) { From 8fae07de0c56b24eb3ceb233cf63484a200fbd8f Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 24 Nov 2022 09:42:46 +0800 Subject: [PATCH 3/6] Update IjkVideoView.java --- .../main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index f3d29a468..d52e83095 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -431,6 +431,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl if (!isInPlaybackState()) return; mInfoListener.onInfo(mIjkPlayer, IMediaPlayer.MEDIA_INFO_BUFFERING_START, 0); mIjkPlayer.seekTo(positionMs); + mStartPosition = 0; } public void seekTo(long positionMs) { From 6f71ab5e09b53517abc25152b84745e0cb646590 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 24 Nov 2022 13:37:47 +0800 Subject: [PATCH 4/6] Update so --- .../main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java index 7c6d9c26a..4f687601e 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java @@ -185,7 +185,6 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer { synchronized (IjkMediaPlayer.class) { if (!mIsLibLoaded) { if (libLoader == null) libLoader = sLocalLibLoader; - libLoader.loadLibrary("ijkffmpeg"); libLoader.loadLibrary("ijksdl"); libLoader.loadLibrary("player"); mIsLibLoaded = true; From 0928bab2c3e77a0cd65f7af05eb9c24eb22fc255 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 24 Nov 2022 14:04:40 +0800 Subject: [PATCH 5/6] Dynamic load so --- .../android/tv/ui/activity/HomeActivity.java | 2 + .../com/fongmi/android/tv/api/SoLoader.java | 56 +++++++++++++++++++ .../com/fongmi/android/tv/utils/FileUtil.java | 5 ++ 3 files changed, 63 insertions(+) create mode 100644 app/src/main/java/com/fongmi/android/tv/api/SoLoader.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index 54e8e2668..6ce2727b0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -17,6 +17,7 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.api.LiveConfig; +import com.fongmi.android.tv.api.SoLoader; import com.fongmi.android.tv.api.WallConfig; import com.fongmi.android.tv.bean.Func; import com.fongmi.android.tv.bean.History; @@ -72,6 +73,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen ApiConfig.get().init().load(getCallback()); mBinding.progressLayout.showProgress(); Updater.create(this).start(); + SoLoader.get().load(); Server.get().start(); setRecyclerView(); setViewModel(); diff --git a/app/src/main/java/com/fongmi/android/tv/api/SoLoader.java b/app/src/main/java/com/fongmi/android/tv/api/SoLoader.java new file mode 100644 index 000000000..c61a07be5 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/api/SoLoader.java @@ -0,0 +1,56 @@ +package com.fongmi.android.tv.api; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.net.OKHttp; +import com.fongmi.android.tv.utils.FileUtil; + +import java.io.File; +import java.io.IOException; + +public class SoLoader { + + private static final int exoVer = 1; + private static final int ijkVer = 1; + + private static final String url = "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/TV/release/other/"; + private static final String exo = "libexo-" + exoVer + ".so"; + private static final String ijk = "libijk-" + ijkVer + ".so"; + + private static class Loader { + static volatile SoLoader INSTANCE = new SoLoader(); + } + + public static SoLoader get() { + return Loader.INSTANCE; + } + + public void load() { + App.execute(() -> { + checkSo(exo); + checkSo(ijk); + }); + } + + private void checkSo(String name) { + try { + File file = new File(FileUtil.getLibDir(), name); + if (!file.exists()) download(file, name); + System.load(file.getAbsolutePath()); + } catch (Exception ignored) { + } + } + + private void download(File file, String name) throws IOException { + remove(name.split("-")[0]); + FileUtil.write(file, OKHttp.newCall(url + name).execute().body().bytes()); + } + + private void remove(String name) { + File directory = FileUtil.getLibDir(); + for (File file : directory.listFiles()) { + if (file.getName().contains(name)) { + file.delete(); + } + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java index e31a7aa77..0c08058ff 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.utils; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; @@ -30,6 +31,10 @@ public class FileUtil { return Environment.getExternalStorageDirectory().getAbsolutePath(); } + public static File getLibDir() { + return App.get().getDir("libs", Context.MODE_PRIVATE); + } + public static File getCacheDir() { return App.get().getCacheDir(); }