Commit 235021a7 authored by jyx's avatar jyx

代码优化

parent 1cdb21b4
......@@ -246,10 +246,6 @@ dependencies {
exclude group: 'com.tencent.mm.opensdk', module: 'wechat-sdk-android'
}
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
......
......@@ -133,6 +133,7 @@ object LocalVedioManager {
fun readyGo(activity: Activity, clazz: Class<*>, bundle: Bundle) {
val intent = Intent(activity, clazz)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (null != bundle) {
intent.putExtras(bundle)
}
......
......@@ -54,9 +54,9 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Base
StatusBarUtil.StatusBarLightMode(this); //设置白底黑字
}
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
getWindow().setNavigationBarColor(Color.BLACK);
// }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
getWindow().setNavigationBarColor(Color.BLACK);
}
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -14,6 +14,7 @@ import com.mints.wisdomclean.mvp.model.BannerList
import com.mints.wisdomclean.mvp.model.VedioBean
import com.mints.wisdomclean.mvp.presenters.RecommendPresenter
import com.mints.wisdomclean.mvp.views.RecommendView
import com.mints.wisdomclean.ui.activitys.SettingsActivity
import com.mints.wisdomclean.ui.fragment.base.BaseFragment
import com.mints.wisdomclean.video.*
import kotlinx.android.synthetic.main.fragment_watch_video.recy
......@@ -65,8 +66,6 @@ class WatchVideoFragment : BaseFragment(), RecommendView {
videos[position],
true
)
// val bundle = Bundle()
// readyGo(VideoActivity::class.java, bundle)
}
R.id.ll_collect -> {
if (videos[position].collect == 0) {
......@@ -95,8 +94,6 @@ class WatchVideoFragment : BaseFragment(), RecommendView {
layoutManager.setOnViewPagerListener(object : OnRecyViewListener {
override fun onInitComplete() {
// mCurrentPosition = 0
//初始化 自动播放
autoPlayVideo()
}
......@@ -174,7 +171,6 @@ class WatchVideoFragment : BaseFragment(), RecommendView {
val player: JzvdStdTikTok = recy.getChildAt(0).findViewById(R.id.jz_video)
if (player != null) {
player.startVideoAfterPreloading()
//播放开始,进行倒计时
}
}
......
package com.mints.wisdomclean.video;
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.view.Surface;
import java.io.IOException;
import cn.jzvd.JZMediaInterface;
import cn.jzvd.Jzvd;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.IjkTimedText;
/**
* Created by Nathen on 2017/11/18.
* ijk兼容SO库:https://github.com/NamHofstadter/IjkPlayerSos
* ijk默认不支持https协议,需要的请自行下载so库
*/
public class JZMediaIjk extends JZMediaInterface implements IMediaPlayer.OnPreparedListener, IMediaPlayer.OnVideoSizeChangedListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnBufferingUpdateListener, IMediaPlayer.OnSeekCompleteListener, IMediaPlayer.OnTimedTextListener {
IjkMediaPlayer ijkMediaPlayer;
public JZMediaIjk(Jzvd jzvd) {
super(jzvd);
}
@Override
public void start() {
if (ijkMediaPlayer != null) ijkMediaPlayer.start();
}
@Override
public void prepare() {
release();
mMediaHandlerThread = new HandlerThread("JZVD");
mMediaHandlerThread.start();
mMediaHandler = new Handler(mMediaHandlerThread.getLooper());//主线程还是非主线程,就在这里
handler = new Handler();
mMediaHandler.post(() -> {
ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
////1为硬解 0为软解
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
//使用opensles把文件从java层拷贝到native层
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0);
//视频格式
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
//跳帧处理(-1~120)。CPU处理慢时,进行跳帧处理,保证音视频同步
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
//0为一进入就播放,1为进入时不播放
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
////域名检测
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
//设置是否开启环路过滤: 0开启,画面质量高,解码开销大,48关闭,画面质量差点,解码开销小
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
//最大缓冲大小,单位kb
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024 * 1024);
//某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
//是否重连
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);
//http重定向https
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
//设置seekTo能够快速seek到指定位置并播放
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "fastseek");
//播放前的探测Size,默认是1M, 改小一点会出画面更快
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10);
//1变速变调状态 0变速不变调状态
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
ijkMediaPlayer.setOnPreparedListener(JZMediaIjk.this);
ijkMediaPlayer.setOnVideoSizeChangedListener(JZMediaIjk.this);
ijkMediaPlayer.setOnCompletionListener(JZMediaIjk.this);
ijkMediaPlayer.setOnErrorListener(JZMediaIjk.this);
ijkMediaPlayer.setOnInfoListener(JZMediaIjk.this);
ijkMediaPlayer.setOnBufferingUpdateListener(JZMediaIjk.this);
ijkMediaPlayer.setOnSeekCompleteListener(JZMediaIjk.this);
ijkMediaPlayer.setOnTimedTextListener(JZMediaIjk.this);
try {
ijkMediaPlayer.setDataSource(jzvd.jzDataSource.getCurrentUrl().toString());
ijkMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
ijkMediaPlayer.setScreenOnWhilePlaying(true);
ijkMediaPlayer.prepareAsync();
ijkMediaPlayer.setSurface(new Surface(jzvd.textureView.getSurfaceTexture()));
} catch (IOException e) {
e.printStackTrace();
}
});
}
@Override
public void pause() {
ijkMediaPlayer.pause();
}
@Override
public boolean isPlaying() {
return ijkMediaPlayer.isPlaying();
}
@Override
public void seekTo(long time) {
ijkMediaPlayer.seekTo(time);
}
@Override
public void release() {
if (mMediaHandler != null && mMediaHandlerThread != null && ijkMediaPlayer != null) {//不知道有没有妖孽
HandlerThread tmpHandlerThread = mMediaHandlerThread;
IjkMediaPlayer tmpMediaPlayer = ijkMediaPlayer;
JZMediaInterface.SAVED_SURFACE = null;
mMediaHandler.post(() -> {
tmpMediaPlayer.setSurface(null);
tmpMediaPlayer.release();
tmpHandlerThread.quit();
});
ijkMediaPlayer = null;
}
}
@Override
public long getCurrentPosition() {
return ijkMediaPlayer.getCurrentPosition();
}
@Override
public long getDuration() {
if (ijkMediaPlayer == null) return 0;
return ijkMediaPlayer.getDuration();
}
@Override
public void setVolume(float leftVolume, float rightVolume) {
ijkMediaPlayer.setVolume(leftVolume, rightVolume);
}
@Override
public void setSpeed(float speed) {
ijkMediaPlayer.setSpeed(speed);
}
@Override
public void onPrepared(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onPrepared());
}
@Override
public void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {
handler.post(() -> jzvd.onVideoSizeChanged(iMediaPlayer.getVideoWidth(), iMediaPlayer.getVideoHeight()));
}
@Override
public boolean onError(IMediaPlayer iMediaPlayer, final int what, final int extra) {
handler.post(() -> jzvd.onError(what, extra));
return true;
}
@Override
public boolean onInfo(IMediaPlayer iMediaPlayer, final int what, final int extra) {
handler.post(() -> jzvd.onInfo(what, extra));
return false;
}
@Override
public void onBufferingUpdate(IMediaPlayer iMediaPlayer, final int percent) {
handler.post(() -> jzvd.setBufferProgress(percent));
}
@Override
public void onSeekComplete(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onSeekComplete());
}
@Override
public void onTimedText(IMediaPlayer iMediaPlayer, IjkTimedText ijkTimedText) {
}
@Override
public void setSurface(Surface surface) {
ijkMediaPlayer.setSurface(surface);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
if (SAVED_SURFACE == null) {
SAVED_SURFACE = surface;
prepare();
} else {
jzvd.textureView.setSurfaceTexture(SAVED_SURFACE);
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
@Override
public void onCompletion(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onCompletion());
}
}
\ No newline at end of file
......@@ -3,8 +3,10 @@ package com.mints.wisdomclean.video
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.Gravity
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Toast
import cn.jzvd.Jzvd
import cn.jzvd.JzvdStd
......@@ -33,19 +35,20 @@ class JzvdStdTikTok : JzvdStd {
totalTimeTextView.visibility = View.GONE //当前时间
fullscreenButton.visibility = View.GONE //放大按钮
topContainer.visibility = View.GONE
progressBar.visibility = View.GONE //控制的
loadingProgressBar.visibility = View.GONE //加载loaing
bottomProgressBar.visibility = View.VISIBLE //最底部的进度
progressBar.visibility = View.VISIBLE //控制的
posterImageView.scaleType = ImageView.ScaleType.FIT_CENTER
val layoutParams = bottomProgressBar.layoutParams
layoutParams.height = UIUtils.dip2px(context, 5f)
bottomProgressBar.layoutParams = layoutParams
val layoutParams2 = progressBar.layoutParams
layoutParams.height = UIUtils.dip2px(context, 5f)
bottomProgressBar.visibility = View.GONE //最底部的进度
val layoutParams2 = progressBar.layoutParams as LinearLayout.LayoutParams
layoutParams2.gravity = Gravity.BOTTOM
layoutParams2.height = UIUtils.dip2px(context, 5f)
progressBar.thumb = context?.getDrawable(R.drawable.jz_bottom_seek_poster)
progressBar.layoutParams = layoutParams2
progressBar.setPadding(0, 0, 0, 0)
val layoutParams3 = startButton.layoutParams
val layoutParams3 = startButton.layoutParams as LinearLayout.LayoutParams
layoutParams3.width = UIUtils.dip2px(context, 100f)
layoutParams3.height = UIUtils.dip2px(context, 100f)
startButton.layoutParams = layoutParams3
......@@ -57,13 +60,13 @@ class JzvdStdTikTok : JzvdStd {
screen: Int,
mediaInterfaceClass: Class<*>?
) {
super.setUp(url, title, screen, JZMediaIjk::class.java)
super.setUp(url, title, screen)
}
//changeUiTo 真能能修改ui的方法
override fun changeUiToNormal() {
super.changeUiToNormal()
bottomContainer.visibility = View.GONE
bottomContainer.visibility = View.VISIBLE
topContainer.visibility = View.GONE
// mDialogProgressBar.setVisibility(GONE);
}
......@@ -73,19 +76,21 @@ class JzvdStdTikTok : JzvdStd {
posterImg: Int, bottomPro: Int, retryLayout: Int
) {
topContainer.visibility = topCon
bottomContainer.visibility = bottomCon
// bottomContainer.visibility = bottomCon
startButton.visibility = startBtn
loadingProgressBar.visibility = View.GONE
posterImageView.visibility = posterImg
bottomProgressBar.visibility = View.VISIBLE
bottomProgressBar.visibility = View.GONE
mRetryLayout.visibility = retryLayout
bottomContainer.visibility = View.VISIBLE
}
override fun dissmissControlView() {
if (state != Jzvd.STATE_NORMAL && state != Jzvd.STATE_ERROR && state != Jzvd.STATE_AUTO_COMPLETE
) {
post {
bottomContainer.visibility = View.INVISIBLE
// bottomContainer.visibility = View.INVISIBLE
topContainer.visibility = View.INVISIBLE
startButton.visibility = View.INVISIBLE
if (clarityPopWindow != null) {
......@@ -102,7 +107,7 @@ class JzvdStdTikTok : JzvdStd {
super.onClickUiToggle()
Log.i(Jzvd.TAG, "click blank")
startButton.performClick()
bottomContainer.visibility = View.GONE
bottomContainer.visibility = View.VISIBLE
topContainer.visibility = View.GONE
}
......
package com.mints.wisdomclean.video
import android.content.Context
import android.util.AttributeSet
import cn.jzvd.JzvdStd
import com.mints.wisdomclean.R
class MyJzvdStd : JzvdStd {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(
context,
attrs
)
override fun getLayoutId() = R.layout.layout_my_video
}
\ No newline at end of file
......@@ -86,7 +86,6 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
override fun onDestroy() {
super.onDestroy()
Jzvd.releaseAllVideos()
videoPresenter.detachView()
}
......@@ -386,4 +385,11 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
}
override fun finish() {
Jzvd.releaseAllVideos()
super.finish()
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/jz_seek_poster_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/jz_seek_poster_normal" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffffffff" />
<size
android:width="5dp"
android:height="5dp" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#fff0f0f0" />
<size
android:width="5dp"
android:height="5dp" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="#a5ffffff" />
<size android:height="4dp" />
<corners android:radius="1dp" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="#ffe0e0e0" />
<size android:height="4dp" />
<corners android:radius="1dp" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="@color/main_mints" />
<size android:height="4dp" />
<corners android:radius="1dp" />
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="#a5ffffff" />
<size android:height="1dp" />
<corners android:radius="1.5dip" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="#ffffffff" />
<size android:height="1dp" />
<corners android:radius="1.5dip" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="@color/main_mints" />
<size android:height="1dp" />
<corners android:radius="1.5dip" />
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<FrameLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<ProgressBar
android:id="@+id/bottom_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_alignParentBottom="true"
android:max="100"
android:progressDrawable="@drawable/player_ag_bottom_progress" />
<ProgressBar
android:id="@+id/loading"
android:layout_width="@dimen/jz_start_button_w_h_normal"
android:layout_height="@dimen/jz_start_button_w_h_normal"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminateDrawable="@drawable/jz_loading"
android:visibility="invisible" />
<LinearLayout
android:id="@+id/start_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/start"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/jz_click_play_selector" />
</LinearLayout>
<LinearLayout
android:id="@+id/retry_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="invisible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/video_loading_failed"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/retry_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:background="@drawable/jz_retry"
android:paddingLeft="9dp"
android:paddingTop="4dp"
android:paddingRight="9dp"
android:paddingBottom="4dp"
android:text="@string/click_to_restart"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
......@@ -50,7 +50,6 @@ allprojects {
maven {
url "https://artifact.bytedance.com/repository/pangle"
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment