- IJK播放器,mp3,mkv,avi等边缓存边播放(公测功能,有bug请反馈) (by okjack)

- 设置新增清空IJK缓存 (by okjack)
- 指定搜索源动态多行显示 (by okjack)
pull/87/merge
okjackcaptain 3 years ago
parent de1f2d7759
commit 9efbe2d46e
  1. 5
      .idea/misc.xml
  2. 43
      app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
  3. 15
      app/src/main/java/com/github/tvbox/osc/ui/dialog/SearchCheckboxDialog.java
  4. 24
      app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
  5. 8
      app/src/main/java/com/github/tvbox/osc/util/FileUtils.java
  6. 10
      app/src/main/res/layout/dialog_checkbox_search.xml
  7. 100
      app/src/main/res/layout/fragment_model.xml
  8. 8
      app/src/main/res/layout/item_dialog_checkbox_search.xml

@ -39,7 +39,12 @@
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/item_quick_search_lite.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/loadsir_loading_layout.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/player_vod_control_view.xml" value="0.3619791666666667" />
<entry key="app/src/main/res/layout/activity_fast_search.xml" value="0.5786666666666667" />
<entry key="app/src/main/res/layout/activity_live_play.xml" value="0.2670906200317965" />
<entry key="app/src/main/res/layout/dialog_checkbox_search.xml" value="0.5786666666666667" />
<entry key="app/src/main/res/layout/dialog_select.xml" value="0.5786666666666667" />
<entry key="app/src/main/res/layout/fragment_model.xml" value="0.5786666666666667" />
<entry key="app/src/main/res/layout/item_dialog_checkbox_search.xml" value="0.5786666666666667" />
</map>
</option>
</component>

@ -5,7 +5,10 @@ import android.text.TextUtils;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.IJKCode;
import com.github.tvbox.osc.util.FileUtils;
import com.github.tvbox.osc.util.MD5;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
@ -56,11 +59,49 @@ public class IjkMediaPlayer extends IjkPlayer {
mMediaPlayer.setOption(1, "infbuf", 1);
mMediaPlayer.setOption(1, "rtsp_transport", "tcp");
mMediaPlayer.setOption(1, "rtsp_flags", "prefer_tcp");
} else if (!TextUtils.isEmpty(path) && (path.contains(".mp4") || path.contains(".mkv") || path.contains(".avi"))) {
String cachePath = FileUtils.getExternalCachePath() + "/ijkcaches/";
String cacheMapPath = cachePath;
File cacheFile = new File(cachePath);
if (!cacheFile.exists()) cacheFile.mkdirs();
String tmpMd5 = MD5.string2MD5(path);
cachePath += tmpMd5 + ".file";
cacheMapPath += tmpMd5 + ".map";
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "cache_file_path", cachePath);
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "cache_map_path", cacheMapPath);
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "parse_cache_map", 1);
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "auto_save_map", 1);
path = "ijkio:cache:ffio:" + path;
}
} catch (Exception e) {
e.printStackTrace();
}
super.setDataSource(path, headers);
setDataSourceHeader(headers);
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "ijkio,ffio,async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data");
super.setDataSource(path, null);
}
private void setDataSourceHeader(Map<String, String> headers) {
if (headers != null && !headers.isEmpty()) {
String userAgent = headers.get("User-Agent");
if (!TextUtils.isEmpty(userAgent)) {
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "user_agent", userAgent);
// 移除header中的User-Agent,防止重复
headers.remove("User-Agent");
}
if (headers.size() > 0) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : headers.entrySet()) {
sb.append(entry.getKey());
sb.append(":");
String value = entry.getValue();
if (!TextUtils.isEmpty(value))
sb.append(entry.getValue());
sb.append("\r\n");
mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "headers", sb.toString());
}
}
}
}
public TrackInfo getTrackInfo() {

@ -3,6 +3,7 @@ package com.github.tvbox.osc.ui.dialog;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
@ -14,6 +15,7 @@ import com.github.tvbox.osc.bean.SourceBean;
import com.github.tvbox.osc.ui.adapter.CheckboxSearchAdapter;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
import org.jetbrains.annotations.NotNull;
@ -21,6 +23,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import me.jessyan.autosize.utils.AutoSizeUtils;
public class SearchCheckboxDialog extends BaseDialog{
private TvRecyclerView mGridView;
@ -66,7 +70,16 @@ public class SearchCheckboxDialog extends BaseDialog{
}
});
mGridView.setHasFixedSize(true);
mGridView.setLayoutManager(new V7LinearLayoutManager(getContext(), 1, false));
int size = mSourceList.size();
int spanCount = (int) Math.floor(size / 10);
if (spanCount <= 0) spanCount = 1;
if (spanCount > 3) spanCount = 3;
mGridView.setLayoutManager(new V7GridLayoutManager(getContext(), spanCount));
View root = findViewById(R.id.root);
ViewGroup.LayoutParams clp = root.getLayoutParams();
clp.width = AutoSizeUtils.mm2px(getContext(), 400 + 260 * (spanCount - 1));
mGridView.setAdapter(checkboxSearchAdapter);
checkboxSearchAdapter.setData(mSourceList, mCheckSourcees);
int pos = 0;

@ -28,8 +28,10 @@ import com.github.tvbox.osc.ui.dialog.SearchRemoteTvDialog;
import com.github.tvbox.osc.ui.dialog.SelectDialog;
import com.github.tvbox.osc.ui.dialog.XWalkInitDialog;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.github.tvbox.osc.util.FileUtils;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.HistoryHelper;
import com.github.tvbox.osc.util.LOG;
import com.github.tvbox.osc.util.OkGoHelper;
import com.github.tvbox.osc.util.PlayerHelper;
import com.lzy.okgo.OkGo;
@ -653,6 +655,28 @@ public class ModelSettingFragment extends BaseLazyFragment {
}
});
findViewById(R.id.llClearIjkCache).setOnClickListener((view -> onClickClearIjkCache()));
}
private void onClickClearIjkCache() {
String cachePath = FileUtils.getExternalCachePath() + "/ijkcaches/";
File cacheDir = new File(cachePath);
if (!cacheDir.exists()) return;
File[] files = cacheDir.listFiles();
if (files != null && files.length > 0) {
try {
for(File one : files) {
LOG.i("ijkplayer cache:" + one.getAbsolutePath());
one.delete();
}
Toast.makeText(getContext(), "ijk缓存已清空", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(getContext(), "暂无ijk缓存", Toast.LENGTH_LONG).show();
}
}

@ -125,6 +125,14 @@ public class FileUtils {
return new File(path.replace("file:/", getRootPath()));
}
public static File getExternalCacheDir() {
return App.getInstance().getExternalCacheDir();
}
public static String getExternalCachePath() {
return getExternalCacheDir().getAbsolutePath();
}
public static String read(String path) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(getLocal(path))));

@ -5,6 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/root"
android:layout_width="@dimen/vs_420"
android:layout_height="match_parent"
android:layout_gravity="center"
@ -14,12 +15,14 @@
<LinearLayout
android:orientation="horizontal"
android:weightSum="2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/checkAll"
android:layout_width="@dimen/vs_200"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/button_dialog_main"
@ -32,11 +35,12 @@
<TextView
android:id="@+id/clearAll"
android:layout_width="@dimen/vs_200"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/vs_10"
android:layout_weight="1"
android:layout_gravity="center"
android:gravity="center"
android:layout_marginLeft="@dimen/vs_20"
android:background="@drawable/button_dialog_main"
android:clickable="true"
android:focusable="true"

@ -890,39 +890,87 @@
android:orientation="horizontal">
<LinearLayout
android:id="@+id/llBackup"
android:layout_width="@dimen/vs_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginEnd="@dimen/vs_5"
android:layout_marginRight="@dimen/vs_5"
android:layout_weight="1"
android:background="@drawable/shape_setting_model_focus"
android:focusable="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_20"
android:paddingRight="@dimen/vs_20">
android:focusable="false"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数据备份还原"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<LinearLayout
android:id="@+id/llBackup"
android:layout_width="@dimen/vs_0"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/vs_5"
android:layout_marginRight="@dimen/vs_5"
android:layout_weight="1"
android:background="@drawable/shape_setting_model_focus"
android:focusable="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_20"
android:paddingRight="@dimen/vs_20">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/vs_10"
android:layout_marginLeft="@dimen/vs_10"
android:text=">"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_30" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数据备份还原"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/vs_10"
android:layout_marginLeft="@dimen/vs_10"
android:text=">"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_30" />
</LinearLayout>
<LinearLayout
android:id="@+id/llClearIjkCache"
android:layout_width="@dimen/vs_0"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/vs_5"
android:layout_marginLeft="@dimen/vs_5"
android:layout_weight="1"
android:background="@drawable/shape_setting_model_focus"
android:focusable="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_20"
android:paddingRight="@dimen/vs_20">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空IJK缓存"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/vs_10"
android:layout_marginLeft="@dimen/vs_10"
android:text=">"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_30" />
</LinearLayout>
</LinearLayout>
<LinearLayout

@ -5,6 +5,10 @@
<LinearLayout
android:layout_gravity="center"
android:paddingTop="@dimen/vs_5"
android:paddingBottom="@dimen/vs_5"
android:paddingLeft="@dimen/vs_10"
android:paddingRight="@dimen/vs_10"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
@ -14,10 +18,6 @@
android:background="@drawable/button_dialog_main"
android:clickable="true"
android:focusable="true"
android:paddingTop="@dimen/vs_5"
android:paddingBottom="@dimen/vs_5"
android:paddingLeft="@dimen/vs_10"
android:paddingRight="@dimen/vs_10"
android:textSize="@dimen/ts_24"
android:text="1111"/>
</LinearLayout>

Loading…
Cancel
Save