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 b7ff330f..b369828f 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 @@ -450,8 +450,12 @@ public class ApiConfig { public IJKCode getCurrentIJKCode() { String codeName = Hawk.get(HawkConfig.IJK_CODEC, ""); + return getIJKCodec(codeName); + } + + public IJKCode getIJKCodec(String name) { for (IJKCode code : ijkCodes) { - if (code.getName().equals(codeName)) + if (code.getName().equals(name)) return code; } return ijkCodes.get(0); diff --git a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java index 2dc65c8f..6d72390c 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java +++ b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java @@ -13,15 +13,18 @@ import xyz.doikki.videoplayer.ijk.IjkPlayer; public class IjkMediaPlayer extends IjkPlayer { - public IjkMediaPlayer(Context context) { + private IJKCode codec = null; + + public IjkMediaPlayer(Context context, IJKCode codec) { super(context); + this.codec = codec; } @Override public void setOptions() { super.setOptions(); - IJKCode codec = ApiConfig.get().getCurrentIJKCode(); - LinkedHashMap options = codec.getOption(); + IJKCode codecTmp = this.codec == null ? ApiConfig.get().getCurrentIJKCode() : this.codec; + LinkedHashMap options = codecTmp.getOption(); if (options != null) { for (String key : options.keySet()) { String value = options.get(key); diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/BaseController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/BaseController.java index 45094c4e..342fea80 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/BaseController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/BaseController.java @@ -90,10 +90,10 @@ public abstract class BaseController extends BaseVideoController implements Gest super(context, attrs, defStyleAttr); } - TextView mSlideInfo; - ProgressBar mLoading; - ViewGroup mPauseRoot; - TextView mPauseTime; + private TextView mSlideInfo; + private ProgressBar mLoading; + private ViewGroup mPauseRoot; + private TextView mPauseTime; @Override protected void initView() { diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index b1f8caaa..7c489c23 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -15,12 +15,20 @@ import androidx.annotation.NonNull; import com.chad.library.adapter.base.BaseQuickAdapter; import com.github.tvbox.osc.R; import com.github.tvbox.osc.api.ApiConfig; +import com.github.tvbox.osc.bean.IJKCode; import com.github.tvbox.osc.bean.ParseBean; import com.github.tvbox.osc.ui.adapter.ParseAdapter; +import com.github.tvbox.osc.util.HawkConfig; +import com.github.tvbox.osc.util.PlayerHelper; +import com.orhanobut.hawk.Hawk; import com.owen.tvrecyclerview.widget.TvRecyclerView; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; import org.jetbrains.annotations.NotNull; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.List; import xyz.doikki.videoplayer.player.VideoView; import xyz.doikki.videoplayer.util.PlayerUtils; @@ -162,43 +170,123 @@ public class VodController extends BaseController { mPlayerScaleBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + int scaleType = mPlayerConfig.getInt("sc"); + scaleType++; + if (scaleType > 5) + scaleType = 0; + mPlayerConfig.put("sc", scaleType); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + mControlWrapper.setScreenScaleType(scaleType); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerSpeedBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + float speed = (float) mPlayerConfig.getDouble("sp"); + speed += 0.5f; + if (speed > 3) + speed = 1; + mPlayerConfig.put("sp", speed); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + mControlWrapper.setSpeed(speed); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + int playerType = mPlayerConfig.getInt("pl"); + playerType++; + if (playerType > 2) + playerType = 0; + mPlayerConfig.put("pl", playerType); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + listener.replay(); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerIJKBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + String ijk = mPlayerConfig.getString("ijk"); + List codecs = ApiConfig.get().getIjkCodes(); + for (int i = 0; i < codecs.size(); i++) { + if (ijk.equals(codecs.get(i).getName())) { + if (i >= codecs.size() - 1) + ijk = codecs.get(0).getName(); + else { + ijk = codecs.get(i + 1).getName(); + } + break; + } + } + mPlayerConfig.put("ijk", ijk); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + listener.replay(); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerTimeStartBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5); + int st = mPlayerConfig.getInt("st"); + st += step; + if (st > 60 * 10) + st = 0; + mPlayerConfig.put("st", st); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerTimeSkipBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + try { + int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5); + int et = mPlayerConfig.getInt("et"); + et += step; + if (et > 60 * 10) + et = 0; + mPlayerConfig.put("et", et); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + } catch (JSONException e) { + e.printStackTrace(); + } } }); mPlayerTimeStepBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - + int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5); + step += 5; + if (step > 30) { + step = 5; + } + Hawk.put(HawkConfig.PLAY_TIME_STEP, step); + updatePlayerCfgView(); } }); } @@ -212,12 +300,40 @@ public class VodController extends BaseController { mParseRoot.setVisibility(userJxList ? VISIBLE : GONE); } + private JSONObject mPlayerConfig = null; + + public void setPlayerConfig(JSONObject playerCfg) { + this.mPlayerConfig = playerCfg; + updatePlayerCfgView(); + } + + void updatePlayerCfgView() { + try { + int playerType = mPlayerConfig.getInt("pl"); + mPlayerBtn.setText(PlayerHelper.getPlayerName(playerType)); + mPlayerScaleBtn.setText(PlayerHelper.getScaleName(mPlayerConfig.getInt("sc"))); + mPlayerIJKBtn.setText(mPlayerConfig.getString("ijk")); + mPlayerIJKBtn.setVisibility(playerType == 1 ? VISIBLE : GONE); + mPlayerScaleBtn.setText(PlayerHelper.getScaleName(mPlayerConfig.getInt("sc"))); + mPlayerSpeedBtn.setText("x" + mPlayerConfig.getDouble("sp")); + mPlayerTimeStartBtn.setText(PlayerUtils.stringForTime(mPlayerConfig.getInt("st") * 1000)); + mPlayerTimeSkipBtn.setText(PlayerUtils.stringForTime(mPlayerConfig.getInt("et") * 1000)); + mPlayerTimeStepBtn.setText(Hawk.get(HawkConfig.PLAY_TIME_STEP, 5) + "s"); + } catch (JSONException e) { + e.printStackTrace(); + } + } + public interface VodControlListener { void playNext(); void playPre(); void changeParse(ParseBean pb); + + void updatePlayerCfg(); + + void replay(); } public void setListener(VodControlListener listener) { @@ -232,6 +348,15 @@ public class VodController extends BaseController { return; } super.setProgress(duration, position); + int et = 0; + try { + et = mPlayerConfig.getInt("et"); + } catch (JSONException e) { + e.printStackTrace(); + } + if (position + (et * 1000) >= duration) { + listener.playNext(); + } mCurrentTime.setText(PlayerUtils.stringForTime(position)); mTotalTime.setText(PlayerUtils.stringForTime(duration)); if (duration > 0) { @@ -299,9 +424,24 @@ public class VodController extends BaseController { protected void onPlayStateChanged(int playState) { super.onPlayStateChanged(playState); switch (playState) { + case VideoView.STATE_IDLE: + break; case VideoView.STATE_PLAYING: startProgress(); break; + case VideoView.STATE_PAUSED: + break; + case VideoView.STATE_ERROR: + break; + case VideoView.STATE_PREPARED: + case VideoView.STATE_BUFFERED: + break; + case VideoView.STATE_PREPARING: + case VideoView.STATE_BUFFERING: + break; + case VideoView.STATE_PLAYBACK_COMPLETED: + listener.playNext(); + break; } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java index 343f35d0..45f21c9c 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java @@ -43,6 +43,7 @@ import com.squareup.picasso.Picasso; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.json.JSONObject; import java.net.URLEncoder; import java.util.ArrayList; @@ -377,17 +378,24 @@ public class DetailActivity extends BaseActivity { public void refresh(RefreshEvent event) { if (event.type == RefreshEvent.TYPE_REFRESH) { if (event.obj != null) { - int index = (int) event.obj; - if (index != vodInfo.playIndex) { - seriesAdapter.getData().get(vodInfo.playIndex).selected = false; - seriesAdapter.notifyItemChanged(vodInfo.playIndex); - seriesAdapter.getData().get(index).selected = true; - seriesAdapter.notifyItemChanged(index); - mGridView.setSelection(index); - vodInfo.playIndex = index; + if (event.obj instanceof Integer) { + int index = (int) event.obj; + if (index != vodInfo.playIndex) { + seriesAdapter.getData().get(vodInfo.playIndex).selected = false; + seriesAdapter.notifyItemChanged(vodInfo.playIndex); + seriesAdapter.getData().get(index).selected = true; + seriesAdapter.notifyItemChanged(index); + mGridView.setSelection(index); + vodInfo.playIndex = index; + //保存历史 + insertVod(sourceKey, vodInfo); + } + } else if (event.obj instanceof JSONObject) { + vodInfo.playerCfg = ((JSONObject) event.obj).toString(); //保存历史 insertVod(sourceKey, vodInfo); } + } } else if (event.type == RefreshEvent.TYPE_QUICK_SEARCH_SELECT) { if (event.obj != null) { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index e688532a..ac808610 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -95,7 +95,6 @@ public class PlayActivity extends BaseActivity { private void initView() { setLoadSir(findViewById(R.id.rootLayout)); mVideoView = findViewById(R.id.mVideoView); - PlayerHelper.updateCfg(mVideoView); controller = new VodController(this); controller.setCanChangePosition(true); controller.setEnableInNormal(true); @@ -109,7 +108,13 @@ public class PlayActivity extends BaseActivity { @Override public long getSavedProgress(String url) { if (CacheManager.getCache(MD5.string2MD5(url)) == null) { - return 0; + int st = 0; + try { + st = mVodPlayerCfg.getInt("st"); + } catch (JSONException e) { + e.printStackTrace(); + } + return st * 1000; } return (long) CacheManager.getCache(MD5.string2MD5(url)); } @@ -129,6 +134,17 @@ public class PlayActivity extends BaseActivity { public void changeParse(ParseBean pb) { doParse(pb); } + + @Override + public void updatePlayerCfg() { + mVodInfo.playerCfg = mVodPlayerCfg.toString(); + EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_REFRESH, mVodPlayerCfg)); + } + + @Override + public void replay() { + play(); + } }); mVideoView.setVideoController(controller); } @@ -158,6 +174,7 @@ public class PlayActivity extends BaseActivity { public void run() { if (mVideoView != null) { mVideoView.release(); + PlayerHelper.updateCfg(mVideoView, mVodPlayerCfg); mVideoView.setProgressKey(progressKey); if (headers != null) { mVideoView.setUrl(url, headers); @@ -223,10 +240,45 @@ public class PlayActivity extends BaseActivity { Bundle bundle = intent.getExtras(); mVodInfo = (VodInfo) bundle.getSerializable("VodInfo"); sourceKey = bundle.getString("sourceKey"); + initPlayerCfg(); play(); } } + void initPlayerCfg() { + try { + mVodPlayerCfg = new JSONObject(mVodInfo.playerCfg); + } catch (Throwable th) { + mVodPlayerCfg = new JSONObject(); + } + try { + if (!mVodPlayerCfg.has("pl")) { + mVodPlayerCfg.put("pl", Hawk.get(HawkConfig.PLAY_TYPE, 1)); + } + if (!mVodPlayerCfg.has("pr")) { + mVodPlayerCfg.put("pr", Hawk.get(HawkConfig.PLAY_RENDER, 0)); + } + if (!mVodPlayerCfg.has("ijk")) { + mVodPlayerCfg.put("ijk", Hawk.get(HawkConfig.IJK_CODEC, "")); + } + if (!mVodPlayerCfg.has("sc")) { + mVodPlayerCfg.put("sc", Hawk.get(HawkConfig.PLAY_SCALE, 0)); + } + if (!mVodPlayerCfg.has("sp")) { + mVodPlayerCfg.put("sp", 1.0f); + } + if (!mVodPlayerCfg.has("st")) { + mVodPlayerCfg.put("st", 0); + } + if (!mVodPlayerCfg.has("et")) { + mVodPlayerCfg.put("et", 0); + } + } catch (Throwable th) { + + } + controller.setPlayerConfig(mVodPlayerCfg); + } + @Override public void onBackPressed() { if (controller.onBackPressed()) { @@ -274,6 +326,7 @@ public class PlayActivity extends BaseActivity { } private VodInfo mVodInfo; + private JSONObject mVodPlayerCfg; private String sourceKey; private void playNext() { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java index 32056fc7..817896c6 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java @@ -1,7 +1,6 @@ package com.github.tvbox.osc.ui.adapter; import android.text.TextUtils; -import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -38,7 +37,7 @@ public class HistoryAdapter extends BaseQuickAdapter { tvYear.setVisibility(View.VISIBLE); }*/ tvYear.setText(ApiConfig.get().getSource(item.sourceKey).getName()); - TextView tvLang = helper.getView(R.id.tvLang); + /*TextView tvLang = helper.getView(R.id.tvLang); if (TextUtils.isEmpty(item.lang)) { tvLang.setVisibility(View.GONE); } else { @@ -59,9 +58,12 @@ public class HistoryAdapter extends BaseQuickAdapter { } else { tvNote.setText(item.note); tvNote.setVisibility(View.VISIBLE); - } + }*/ + helper.setVisible(R.id.tvLang, false); + helper.setVisible(R.id.tvArea, false); + helper.setVisible(R.id.tvNote, false); helper.setText(R.id.tvName, item.name); - helper.setText(R.id.tvActor, item.actor); + // helper.setText(R.id.tvActor, item.actor); ImageView ivThumb = helper.getView(R.id.ivThumb); //由于部分电视机使用glide报错 if (!TextUtils.isEmpty(item.pic)) { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java index 43f7177b..c1dc2207 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java @@ -42,6 +42,7 @@ public class ModelSettingFragment extends BaseLazyFragment { private TextView tvParseWebView; private TextView tvPlay; private TextView tvRender; + private TextView tvScale; private TextView tvXWalkDown; private TextView tvApi; private TextView tvHomeApi; @@ -66,6 +67,7 @@ public class ModelSettingFragment extends BaseLazyFragment { tvMediaCodec = findViewById(R.id.tvMediaCodec); tvPlay = findViewById(R.id.tvPlay); tvRender = findViewById(R.id.tvRenderType); + tvScale = findViewById(R.id.tvScaleType); tvXWalkDown = findViewById(R.id.tvXWalkDown); tvApi = findViewById(R.id.tvApi); tvHomeApi = findViewById(R.id.tvHomeApi); @@ -75,6 +77,7 @@ public class ModelSettingFragment extends BaseLazyFragment { tvXWalkDown.setText(XWalkUtils.xWalkLibExist(mContext) ? "已下载" : "未下载"); tvApi.setText(Hawk.get(HawkConfig.API_URL, "")); tvHomeApi.setText(ApiConfig.get().getHomeSourceBean().getName()); + tvScale.setText(PlayerHelper.getScaleName(Hawk.get(HawkConfig.PLAY_SCALE, 0))); tvPlay.setText(PlayerHelper.getPlayerName(Hawk.get(HawkConfig.PLAY_TYPE, 0))); tvRender.setText(PlayerHelper.getRenderName(Hawk.get(HawkConfig.PLAY_RENDER, 0))); findViewById(R.id.llXWalkCore).setVisibility(Hawk.get(HawkConfig.PARSE_WEBVIEW, true) ? View.GONE : View.VISIBLE); @@ -230,6 +233,45 @@ public class ModelSettingFragment extends BaseLazyFragment { dialog.show(); } }); + findViewById(R.id.llScale).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FastClickCheckUtil.check(v); + int defaultPos = Hawk.get(HawkConfig.PLAY_SCALE, 0); + ArrayList players = new ArrayList<>(); + players.add(0); + players.add(1); + players.add(2); + players.add(3); + players.add(4); + players.add(4); + SelectDialog dialog = new SelectDialog<>(mActivity); + dialog.setTip("请选择默认画面缩放"); + dialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface() { + @Override + public void click(Integer value, int pos) { + Hawk.put(HawkConfig.PLAY_SCALE, value); + tvScale.setText(PlayerHelper.getScaleName(value)); + } + + @Override + public String getDisplay(Integer val) { + return PlayerHelper.getScaleName(val); + } + }, new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) { + return oldItem.intValue() == newItem.intValue(); + } + + @Override + public boolean areContentsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) { + return oldItem.intValue() == newItem.intValue(); + } + }, players, defaultPos); + dialog.show(); + } + }); findViewById(R.id.llPlay).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { 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 67c24ff4..bf3fda37 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 @@ -16,4 +16,6 @@ public class HawkConfig { public static final String LIVE_CHANNEL = "last_live_channel_name"; public static final String PLAY_TYPE = "play_type";//0 系统;1 ijk;2 exo 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 } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java b/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java index 1f517429..17684a66 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java @@ -2,29 +2,44 @@ package com.github.tvbox.osc.util; import android.content.Context; +import com.github.tvbox.osc.api.ApiConfig; +import com.github.tvbox.osc.bean.IJKCode; import com.github.tvbox.osc.player.IjkMediaPlayer; import com.github.tvbox.osc.player.render.SurfaceRenderViewFactory; import com.orhanobut.hawk.Hawk; +import org.json.JSONException; +import org.json.JSONObject; + import tv.danmaku.ijk.media.player.IjkLibLoader; import xyz.doikki.videoplayer.exo.ExoMediaPlayerFactory; import xyz.doikki.videoplayer.player.AndroidMediaPlayerFactory; import xyz.doikki.videoplayer.player.PlayerFactory; import xyz.doikki.videoplayer.player.VideoView; -import xyz.doikki.videoplayer.player.VideoViewConfig; -import xyz.doikki.videoplayer.player.VideoViewManager; import xyz.doikki.videoplayer.render.RenderViewFactory; import xyz.doikki.videoplayer.render.TextureRenderViewFactory; public class PlayerHelper { - public static void updateCfg(VideoView videoView) { - int playType = Hawk.get(HawkConfig.PLAY_TYPE, 0); + public static void updateCfg(VideoView videoView, JSONObject playerCfg) { + int playerType = Hawk.get(HawkConfig.PLAY_TYPE, 0); + int renderType = Hawk.get(HawkConfig.PLAY_RENDER, 0); + String ijkCode = Hawk.get(HawkConfig.IJK_CODEC, "软解码"); + int scale = Hawk.get(HawkConfig.PLAY_SCALE, 0); + try { + playerType = playerCfg.getInt("pl"); + renderType = playerCfg.getInt("pr"); + ijkCode = playerCfg.getString("ijk"); + scale = playerCfg.getInt("sc"); + } catch (JSONException e) { + e.printStackTrace(); + } + IJKCode codec = ApiConfig.get().getIJKCodec(ijkCode); PlayerFactory playerFactory; - if (playType == 1) { + if (playerType == 1) { playerFactory = new PlayerFactory() { @Override public IjkMediaPlayer createPlayer(Context context) { - return new IjkMediaPlayer(context); + return new IjkMediaPlayer(context, codec); } }; try { @@ -41,12 +56,11 @@ public class PlayerHelper { } catch (Throwable th) { th.printStackTrace(); } - } else if (playType == 2) { + } else if (playerType == 2) { playerFactory = ExoMediaPlayerFactory.create(); } else { playerFactory = AndroidMediaPlayerFactory.create(); } - int renderType = Hawk.get(HawkConfig.PLAY_RENDER, 0); RenderViewFactory renderViewFactory = null; switch (renderType) { case 0: @@ -59,17 +73,17 @@ public class PlayerHelper { } videoView.setPlayerFactory(playerFactory); videoView.setRenderViewFactory(renderViewFactory); + videoView.setScreenScaleType(scale); } - - public static void init() { + public static void updateCfg(VideoView videoView) { int playType = Hawk.get(HawkConfig.PLAY_TYPE, 0); PlayerFactory playerFactory; if (playType == 1) { playerFactory = new PlayerFactory() { @Override public IjkMediaPlayer createPlayer(Context context) { - return new IjkMediaPlayer(context); + return new IjkMediaPlayer(context, null); } }; try { @@ -102,13 +116,26 @@ public class PlayerHelper { renderViewFactory = SurfaceRenderViewFactory.create(); break; } - //播放器配置,注意:此为全局配置,按需开启 - VideoViewManager.setConfig(VideoViewConfig.newBuilder() - .setLogEnabled(Hawk.get(HawkConfig.DEBUG_OPEN, false)) - .setScreenScaleType(VideoView.SCREEN_SCALE_DEFAULT) - .setPlayerFactory(playerFactory) - .setRenderViewFactory(renderViewFactory) - .build()); + videoView.setPlayerFactory(playerFactory); + videoView.setRenderViewFactory(renderViewFactory); + } + + + public static void init() { + try { + tv.danmaku.ijk.media.player.IjkMediaPlayer.loadLibrariesOnce(new IjkLibLoader() { + @Override + public void loadLibrary(String s) throws UnsatisfiedLinkError, SecurityException { + try { + System.loadLibrary(s); + } catch (Throwable th) { + th.printStackTrace(); + } + } + }); + } catch (Throwable th) { + th.printStackTrace(); + } } public static String getPlayerName(int playType) { diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index 47b41d47..fa6d0234 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -1,11 +1,18 @@ - + android:layout_height="match_parent" + android:background="@android:color/black"> - + android:layout_height="match_parent"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_model.xml b/app/src/main/res/layout/fragment_model.xml index baf4fbfd..d0b8f047 100644 --- a/app/src/main/res/layout/fragment_model.xml +++ b/app/src/main/res/layout/fragment_model.xml @@ -280,6 +280,48 @@ android:textSize="@dimen/ts_30" /> + + + + + + + + + + + -