Skip to content

Commit

Permalink
Merge pull request q215613905#47 from okjackcaptain/main
Browse files Browse the repository at this point in the history
支持挂载字幕 by okjack
  • Loading branch information
q215613905 committed Sep 15, 2022
2 parents 590aa15 + 22819fe commit c0094bb
Show file tree
Hide file tree
Showing 28 changed files with 5,067 additions and 11 deletions.
29 changes: 29 additions & 0 deletions app/src/main/java/com/github/tvbox/osc/player/MyVideoView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.github.tvbox.osc.player;

import android.content.Context;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import xyz.doikki.videoplayer.player.AbstractPlayer;
import xyz.doikki.videoplayer.player.VideoView;

public class MyVideoView extends VideoView {
public MyVideoView(@NonNull Context context) {
super(context, null);
}

public MyVideoView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs, 0);
}

public MyVideoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public AbstractPlayer getMediaPlayer() {
return mMediaPlayer;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.github.tvbox.osc.bean.ParseBean;
import com.github.tvbox.osc.player.thirdparty.MXPlayer;
import com.github.tvbox.osc.player.thirdparty.ReexPlayer;
import com.github.tvbox.osc.subtitle.widget.SimpleSubtitleView;
import com.github.tvbox.osc.ui.adapter.ParseAdapter;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.PlayerHelper;
Expand Down Expand Up @@ -101,6 +102,7 @@ public void callback(Message msg) {
TvRecyclerView mGridView;
TextView mPlayTitle;
TextView mPlayTitle1;
TextView mPlayLoadNetSpeedRightTop;
TextView mNextBtn;
TextView mPreBtn;
TextView mPlayerScaleBtn;
Expand All @@ -115,6 +117,7 @@ public void callback(Message msg) {
TextView mPlayPauseTime;
TextView mPlayLoadNetSpeed;
TextView mVideoSize;
public SimpleSubtitleView mSubtitleView;

Handler myHandle;
Runnable myRunnable;
Expand All @@ -125,10 +128,10 @@ public void callback(Message msg) {
public void run() {
Date date = new Date();
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
mPlayPauseTime.setText(timeFormat.format(date));
String speed = PlayerHelper.getDisplaySpeed(mControlWrapper.getTcpSpeed());
mPlayPauseTime.setText(speed + " " + timeFormat.format(date));

mPlayLoadNetSpeed.setText(PlayerHelper.getDisplaySpeed(mControlWrapper.getTcpSpeed()));
mPlayLoadNetSpeedRightTop.setText(speed);
mPlayLoadNetSpeed.setText(speed);
String width = Integer.toString(mControlWrapper.getVideoSize()[0]);
String height = Integer.toString(mControlWrapper.getVideoSize()[1]);
mVideoSize.setText("[ " + width + " X " + height +" ]");
Expand All @@ -148,6 +151,7 @@ protected void initView() {
mTotalTime = findViewById(R.id.total_time);
mPlayTitle = findViewById(R.id.tv_info_name);
mPlayTitle1 = findViewById(R.id.tv_info_name1);
mPlayLoadNetSpeedRightTop = findViewById(R.id.tv_play_load_net_speed_right_top);
mSeekBar = findViewById(R.id.seekBar);
mProgressRoot = findViewById(R.id.tv_progress_container);
mProgressIcon = findViewById(R.id.tv_progress_icon);
Expand All @@ -171,6 +175,7 @@ protected void initView() {
mPlayPauseTime = findViewById(R.id.tv_sys_time);
mPlayLoadNetSpeed = findViewById(R.id.tv_play_load_net_speed);
mVideoSize = findViewById(R.id.tv_videosize);
mSubtitleView = findViewById(R.id.subtitle_view);

myHandle=new Handler();
myRunnable = new Runnable() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
/*
* Copyright (C) of Avery
*
* _ooOoo_
* o8888888o
* 88" . "88
* (| -_- |)
* O\ = /O
* ____/`- -'\____
* .' \\| |// `.
* / \\||| : |||// \
* / _||||| -:- |||||- \
* | | \\\ - /// | |
* | \_| ''\- -/'' | |
* \ .-\__ `-` ___/-. /
* ___`. .' /- -.- -\ `. . __
* ."" '< `.___\_<|>_/___.' >'"".
* | | : `- \`.;`\ _ /`;.`/ - ` : | |
* \ \ `-. \_ __\ /__ _/ .-` / /
* ======`-.____`-.___\_____/___.-`____.-'======
* `=- -='
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Buddha bless, there will never be bug!!!
*/

package com.github.tvbox.osc.subtitle;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;

import com.github.tvbox.osc.subtitle.cache.SubtitleCache;
import com.github.tvbox.osc.subtitle.model.Subtitle;
import com.github.tvbox.osc.subtitle.model.TimedTextObject;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

import xyz.doikki.videoplayer.player.AbstractPlayer;

/**
* @author AveryZhong.
*/

public class DefaultSubtitleEngine implements SubtitleEngine {
private static final String TAG = DefaultSubtitleEngine.class.getSimpleName();
private static final int MSG_REFRESH = 0x888;
private static final int REFRESH_INTERVAL = 100;

@Nullable
private HandlerThread mHandlerThread;
@Nullable
private Handler mWorkHandler;
@Nullable
private List<Subtitle> mSubtitles;
private UIRenderTask mUIRenderTask;
private AbstractPlayer mMediaPlayer;
private SubtitleCache mCache;
private OnSubtitlePreparedListener mOnSubtitlePreparedListener;
private OnSubtitleChangeListener mOnSubtitleChangeListener;

public DefaultSubtitleEngine() {
mCache = new SubtitleCache();

}

@Override
public void bindToMediaPlayer(AbstractPlayer mediaPlayer) {
mMediaPlayer = mediaPlayer;
}

@Override
public void setSubtitlePath(final String path) {
initWorkThread();
reset();
if (TextUtils.isEmpty(path)) {
Log.w(TAG, "loadSubtitleFromRemote: path is null.");
return;
}
mSubtitles = mCache.get(path);
if (mSubtitles != null && !mSubtitles.isEmpty()) {
Log.d(TAG, "from cache.");
notifyPrepared();
return;
}
SubtitleLoader.loadSubtitle(path, new SubtitleLoader.Callback() {
@Override
public void onSuccess(final TimedTextObject timedTextObject) {
if (timedTextObject == null) {
Log.d(TAG, "onSuccess: timedTextObject is null.");
return;
}
final TreeMap<Integer, Subtitle> captions = timedTextObject.captions;
if (captions == null) {
Log.d(TAG, "onSuccess: captions is null.");
return;
}
mSubtitles = new ArrayList<>(captions.values());
notifyPrepared();
mCache.put(path, new ArrayList<>(captions.values()));
}

@Override
public void onError(final Exception exception) {
Log.e(TAG, "onError: " + exception.getMessage());
}
});
}

@Override
public void reset() {
stop();
mSubtitles = null;
mUIRenderTask = null;
}

@Override
public void start() {
Log.d(TAG, "start: ");
if (mMediaPlayer == null) {
Log.w(TAG, "MediaPlayer is not bind, You must bind MediaPlayer to "
+ SubtitleEngine.class.getSimpleName()
+ " before start() method be called,"
+ " you can do this by call " +
"bindToMediaPlayer(MediaPlayer mediaPlayer) method.");
return;
}
stop();
if (mWorkHandler != null) {
mWorkHandler.sendEmptyMessageDelayed(MSG_REFRESH, REFRESH_INTERVAL);
}

}

@Override
public void pause() {
stop();
}

@Override
public void resume() {
start();
}

@Override
public void stop() {
if (mWorkHandler != null) {
mWorkHandler.removeMessages(MSG_REFRESH);
}
}

@Override
public void destroy() {
Log.d(TAG, "destroy: ");
stopWorkThread();
reset();

}

private void initWorkThread() {
stopWorkThread();
mHandlerThread = new HandlerThread("SubtitleFindThread");
mHandlerThread.start();
mWorkHandler = new Handler(mHandlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(final Message msg) {
try {
long delay = REFRESH_INTERVAL;
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
long position = mMediaPlayer.getCurrentPosition();
Subtitle subtitle = SubtitleFinder.find(position, mSubtitles);
notifyRefreshUI(subtitle);
if (subtitle != null) {
delay = subtitle.end.mseconds - position;
}

}
if (mWorkHandler != null) {
mWorkHandler.sendEmptyMessageDelayed(MSG_REFRESH, delay);
}
} catch (Exception e) {
// ignored
}
return true;
}
});
}

private void stopWorkThread() {
if (mHandlerThread != null) {
mHandlerThread.quit();
mHandlerThread = null;
}
if (mWorkHandler != null) {
mWorkHandler.removeCallbacksAndMessages(null);
mWorkHandler = null;
}
}

private void notifyRefreshUI(final Subtitle subtitle) {
if (mUIRenderTask == null) {
mUIRenderTask = new UIRenderTask(mOnSubtitleChangeListener);
}
mUIRenderTask.execute(subtitle);
}

private void notifyPrepared() {
if (mOnSubtitlePreparedListener != null) {
mOnSubtitlePreparedListener.onSubtitlePrepared(mSubtitles);
}
}

@Override
public void setOnSubtitlePreparedListener(final OnSubtitlePreparedListener listener) {
mOnSubtitlePreparedListener = listener;
}

@Override
public void setOnSubtitleChangeListener(final OnSubtitleChangeListener listener) {
mOnSubtitleChangeListener = listener;
}

}
Loading

0 comments on commit c0094bb

Please sign in to comment.