From 97c692d41db3db2c62d392fbc784b183996e3e1b Mon Sep 17 00:00:00 2001 From: hch <16607480311@163.com> Date: Mon, 1 Apr 2024 18:20:10 +0800 Subject: [PATCH] =?UTF-8?q?fix=20[=E4=BF=AE=E5=A4=8D-=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=A1=86=E6=9E=B6]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/build.gradle | 4 + .../com/yunbao/common/utils/RouteUtil.java | 6 +- .../res/layout/item_comment_video_view.xml | 1 + live/build.gradle | 2 +- live/src/main/AndroidManifest.xml | 11 +- .../live/activity/VideoPlayActivity.java | 121 +++++++++ .../main/res/layout/activity_google_play.xml | 12 + .../main/views/MainHomeNewViewHolder.java | 7 +- .../video/activity/VideoPlayNewActivity.java | 2 - .../com/yunbao/video/views/MyImageView.java | 37 +++ .../video/views/VideoPlayViewHolder.java | 238 +++++++----------- .../video/views/VideoPlayWrapViewHolder.java | 18 +- .../res/layout/activity_video_new_play.xml | 10 + video/src/main/res/layout/view_video_play.xml | 11 +- .../main/res/layout/view_video_play_wrap.xml | 5 +- 15 files changed, 316 insertions(+), 169 deletions(-) create mode 100644 live/src/main/java/com/yunbao/live/activity/VideoPlayActivity.java create mode 100644 live/src/main/res/layout/activity_google_play.xml create mode 100644 video/src/main/java/com/yunbao/video/views/MyImageView.java create mode 100644 video/src/main/res/layout/activity_video_new_play.xml diff --git a/common/build.gradle b/common/build.gradle index f20b49dc9..e97c145bd 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -242,4 +242,8 @@ dependencies { api 'com.github.xuexiangjys:XUI:1.1.6' api 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0' + //ExoPlayer,腾讯的播放器不支持无缝切换 + api 'com.google.android.exoplayer:exoplayer:2.18.2' + api 'com.google.android.exoplayer:exoplayer-core:2.18.2@aar' + } diff --git a/common/src/main/java/com/yunbao/common/utils/RouteUtil.java b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java index e97a37b16..7ccc481cf 100644 --- a/common/src/main/java/com/yunbao/common/utils/RouteUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java @@ -59,12 +59,12 @@ public class RouteUtil { public static final String PATH_VIDEO_NEW_PLAY = "/video/VideoPlayNewActivity"; - /* public static void forwardVideoPlayActivity(ActiveBean bean) { - ARouter.getInstance().build(PATH_VIDEO_PLAY) + public static void forwardVideoPlayNewActivity(ActiveBean bean) { + ARouter.getInstance().build(PATH_VIDEO_NEW_PLAY) .withParcelable("ActiveBean", bean) .withString(Constants.VIDEO_KEY, Constants.VIDEO_SINGLE) .navigation(); - }*/ + } public static void forwardUserHome(String uid) { ARouter.getInstance().build(PATH_USER_HOME) diff --git a/common/src/main/res/layout/item_comment_video_view.xml b/common/src/main/res/layout/item_comment_video_view.xml index d0b15156b..1fa2d4d11 100644 --- a/common/src/main/res/layout/item_comment_video_view.xml +++ b/common/src/main/res/layout/item_comment_video_view.xml @@ -24,6 +24,7 @@ android:id="@+id/avatar" android:layout_width="50dp" android:layout_height="50dp" + android:scaleType="centerCrop" android:src="@mipmap/icon_data_empty" app:riv_oval="true" /> diff --git a/live/build.gradle b/live/build.gradle index 53402f163..323d07a01 100644 --- a/live/build.gradle +++ b/live/build.gradle @@ -1 +1 @@ -apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' android { namespace "com.yunbao.live" compileSdk rootProject.ext.android.compileSdkVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_18 targetCompatibility JavaVersion.VERSION_18 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path: ':common') api project(path:':FaceUnity')//新娱美颜 api project(':Share')//分享 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 api rootProject.ext.dependencies["blank-utilcode"] implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" //ExoPlayer,腾讯的播放器不支持无缝切换 implementation 'com.google.android.exoplayer:exoplayer:2.18.2' implementation 'com.google.android.exoplayer:exoplayer-core:2.18.2@aar' } \ No newline at end of file +apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' android { namespace "com.yunbao.live" compileSdk rootProject.ext.android.compileSdkVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_18 targetCompatibility JavaVersion.VERSION_18 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path: ':common') api project(path:':FaceUnity')//新娱美颜 api project(':Share')//分享 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 api rootProject.ext.dependencies["blank-utilcode"] implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" } \ No newline at end of file diff --git a/live/src/main/AndroidManifest.xml b/live/src/main/AndroidManifest.xml index b87f97428..c8084b9df 100644 --- a/live/src/main/AndroidManifest.xml +++ b/live/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -11,8 +10,8 @@ + android:theme="@style/AppTheme" + tools:replace="allowBackup"> + + \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/activity/VideoPlayActivity.java b/live/src/main/java/com/yunbao/live/activity/VideoPlayActivity.java new file mode 100644 index 000000000..e6b43edfc --- /dev/null +++ b/live/src/main/java/com/yunbao/live/activity/VideoPlayActivity.java @@ -0,0 +1,121 @@ +package com.yunbao.live.activity; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentTransaction; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; +import com.google.android.exoplayer2.ui.PlayerView; +import com.google.android.exoplayer2.ui.StyledPlayerView; +import com.lxj.xpopup.XPopup; +import com.makeramen.roundedimageview.RoundedImageView; +import com.yunbao.common.Constants; +import com.yunbao.common.activity.AbsActivity; +import com.yunbao.common.event.GiftWallItemEvent; +import com.yunbao.common.event.LiveGiftDialogEvent; +import com.yunbao.common.fragment.AllServiceChampionFragment; +import com.yunbao.common.fragment.GiftWithoutWallFragment; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; +import com.yunbao.live.R; +import com.yunbao.live.dialog.CodexDialog; +import com.yunbao.live.dialog.GiftWallItemPopup; +import com.yunbao.live.dialog.MedalAchievementPopup; +import com.yunbao.live.views.GiftAlreadyWallFragment; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + +public class VideoPlayActivity extends AbsActivity { + private PlayerView placeholderView; + private ExoPlayer player1; + + @Override + protected int getLayoutId() { + return R.layout.activity_google_play; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + DefaultLoadControl control = new DefaultLoadControl.Builder() + .setPrioritizeTimeOverSizeThresholds(false) + .setBackBuffer(10_000, true) + .setBufferDurationsMs(500, + 5_000, + 150, + 200) + .build(); + placeholderView = findViewById(R.id.placeholderView); + player1 = new ExoPlayer.Builder(mContext).setLoadControl(control).build(); + player1.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); + placeholderView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL); + placeholderView.requestLayout(); + placeholderView.setKeepContentOnPlayerReset(true); + placeholderView.setPlayer(player1); + + placeholderView.setShowRewindButton(false); + placeholderView.setShowFastForwardButton(false); + placeholderView.setShowPreviousButton(false); + placeholderView.setShowNextButton(false); + placeholderView.setShowShuffleButton(false); + placeholderView.setShowMultiWindowTimeBar(false); + placeholderView.setControllerAutoShow(false); + placeholderView.setUseController(false); + + player1.addListener(new Player.Listener() { + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + switch (playbackState) { + case ExoPlayer.STATE_IDLE: + L.e("ExoPlayer.STATE_IDLE-播放器已实例化,但尚未准备就绪。"); + break; + case ExoPlayer.STATE_BUFFERING: + L.e("ExoPlayer.STATE_BUFFERING-播放器无法从当前位置开始播放,因为已缓冲的数据不足。"); + break; + case ExoPlayer.STATE_READY: + L.e("ExoPlayer.STATE_READY-播放器可以立即从当前位置开始播放。这意味着如果播放器的 playWhenReady 属性为 true,播放器将自动开始播放媒体。如果该属性为 false,播放器会暂停播放。"); + break; + case ExoPlayer.STATE_ENDED: + L.e("ExoPlayer.STATE_ENDED-播放器已完成媒体播放。"); + break; + } + } + }); + + player1.setMediaItem(createMediaItem("https://downs.yaoulive.com/userhome/2024-03-29/98918_r3a5urihjf7qmlnkhdr5ak5ir1.MP4")); + player1.prepare(); + player1.play(); + } + + private MediaItem createMediaItem(String url) { + return MediaItem.fromUri(url); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } + +} \ No newline at end of file diff --git a/live/src/main/res/layout/activity_google_play.xml b/live/src/main/res/layout/activity_google_play.xml new file mode 100644 index 000000000..517f6a505 --- /dev/null +++ b/live/src/main/res/layout/activity_google_play.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/main/src/main/java/com/yunbao/main/views/MainHomeNewViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainHomeNewViewHolder.java index 23ec7064d..4985bd065 100644 --- a/main/src/main/java/com/yunbao/main/views/MainHomeNewViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainHomeNewViewHolder.java @@ -3,6 +3,7 @@ package com.yunbao.main.views; import android.animation.ObjectAnimator; import android.app.Dialog; import android.content.Context; +import android.content.Intent; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -93,7 +94,7 @@ public class MainHomeNewViewHolder extends AbsMainHomeChildViewHolder implements @Override public void init() { - List list = CommonAppConfig.getCommunityTypeList(true,mContext); + List list = CommonAppConfig.getCommunityTypeList(true, mContext); typeHot = list.get(0).getTalk_name(); select = list.get(0).getId(); @@ -253,6 +254,10 @@ public class MainHomeNewViewHolder extends AbsMainHomeChildViewHolder implements VideoStorge.getInstance().put(Constants.VIDEO_HOME, videoList); VideoPlayActivity.forward(mContext, playPosition, Constants.VIDEO_HOME, 1); } + + /*Intent intent = new Intent(mContext, com.yunbao.live.activity.VideoPlayActivity.class); + mContext.startActivity(intent);*/ + } /** diff --git a/video/src/main/java/com/yunbao/video/activity/VideoPlayNewActivity.java b/video/src/main/java/com/yunbao/video/activity/VideoPlayNewActivity.java index f3832d2b3..21308ee2b 100644 --- a/video/src/main/java/com/yunbao/video/activity/VideoPlayNewActivity.java +++ b/video/src/main/java/com/yunbao/video/activity/VideoPlayNewActivity.java @@ -43,7 +43,6 @@ public class VideoPlayNewActivity extends AbsVideoPlayActivity { context.startActivity(intent); } - public static void forwardSingle(Context context, ActiveBean videoBean) { if (videoBean == null) { return; @@ -80,7 +79,6 @@ public class VideoPlayNewActivity extends AbsVideoPlayActivity { } - @Override protected int getLayoutId() { return R.layout.activity_video_play; diff --git a/video/src/main/java/com/yunbao/video/views/MyImageView.java b/video/src/main/java/com/yunbao/video/views/MyImageView.java new file mode 100644 index 000000000..442b8d54d --- /dev/null +++ b/video/src/main/java/com/yunbao/video/views/MyImageView.java @@ -0,0 +1,37 @@ +package com.yunbao.video.views; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class MyImageView extends androidx.appcompat.widget.AppCompatImageView { + public MyImageView(@NonNull Context context) { + super(context); + } + + public MyImageView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public MyImageView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + Drawable drawable = getDrawable(); + if (drawable != null) { + //图片 使用android:layout_width="match_parent",得到的是整个屏幕宽 + int width = MeasureSpec.getSize(widthMeasureSpec); + // 根据图片的宽度填充屏幕后 计算得到自适应的图片高度 + int height = (int) Math.ceil((float) width * (float) drawable.getIntrinsicHeight() / (float) drawable.getIntrinsicWidth()); + setMeasuredDimension(width, height); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } +} diff --git a/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java b/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java index 50a3f12ed..86669a05e 100644 --- a/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java +++ b/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java @@ -3,23 +3,23 @@ package com.yunbao.video.views; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.content.Context; -import android.os.Bundle; -import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; -import android.widget.RelativeLayout; -import com.tencent.rtmp.ITXVodPlayListener; -import com.tencent.rtmp.TXLiveConstants; -import com.tencent.rtmp.TXVodPlayConfig; -import com.tencent.rtmp.TXVodPlayer; -import com.tencent.rtmp.ui.TXCloudVideoView; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; +import com.google.android.exoplayer2.ui.StyledPlayerView; import com.yunbao.common.bean.ActiveBean; import com.yunbao.common.utils.L; +import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.AbsViewHolder; import com.yunbao.video.R; -import com.yunbao.common.bean.VideoBean; import com.yunbao.video.http.VideoHttpConsts; import com.yunbao.video.http.VideoHttpUtil; @@ -28,21 +28,18 @@ import com.yunbao.video.http.VideoHttpUtil; * 视频播放器 */ -public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayListener, View.OnClickListener { - - private TXCloudVideoView mTXCloudVideoView; +public class VideoPlayViewHolder extends AbsViewHolder implements View.OnClickListener { + private StyledPlayerView placeholderView; + private ExoPlayer mPlayer; private View mVideoCover; - private TXVodPlayer mPlayer; private boolean mPaused;//生命周期暂停 private boolean mClickPaused;//点击暂停 - private ActionListener mActionListener; private View mPlayBtn; + private ActionListener mActionListener; private ObjectAnimator mPlayBtnAnimator;//暂停按钮的动画 private boolean mStartPlay; private boolean mEndPlay; private ActiveBean mVideoBean; - private String mCachePath; - private TXVodPlayConfig mTXVodPlayConfig; public VideoPlayViewHolder(Context context, ViewGroup parentView) { super(context, parentView); @@ -55,19 +52,69 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList @Override public void init() { - mCachePath = mContext.getCacheDir().getAbsolutePath(); - mTXCloudVideoView = (TXCloudVideoView) findViewById(R.id.video_view); - mTXCloudVideoView.setRenderMode(TXLiveConstants.RENDER_ROTATION_PORTRAIT); - mPlayer = new TXVodPlayer(mContext); - mTXVodPlayConfig = new TXVodPlayConfig(); - mTXVodPlayConfig.setMaxCacheItems(15); - mTXVodPlayConfig.setProgressInterval(200); - mPlayer.setConfig(mTXVodPlayConfig); - mPlayer.setAutoPlay(true); - mPlayer.setVodListener(this); - mPlayer.setPlayerView(mTXCloudVideoView); - findViewById(R.id.root).setOnClickListener(this); + placeholderView = findViewById(R.id.placeholderView); + intiPlayView(); + } + + private void intiPlayView() { + DefaultLoadControl control = new DefaultLoadControl.Builder() + .setPrioritizeTimeOverSizeThresholds(false) + .setBackBuffer(10_000, true) + .setBufferDurationsMs(500, + 5_000, + 150, + 200) + .build(); + mPlayer = new ExoPlayer.Builder(mContext).setLoadControl(control).build(); + placeholderView = findViewById(com.yunbao.live.R.id.placeholderView); + mPlayer = new ExoPlayer.Builder(mContext).setLoadControl(control).build(); + mPlayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_DEFAULT); + + mPlayer.addListener(new Player.Listener() { + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + switch (playbackState) { + case Player.STATE_IDLE://这是初始状态、播放器停止时以及播放失败时的状态。在此状态下,播放器将仅保留有限的资源。 + break; + case Player.STATE_BUFFERING://播放器无法立即从当前位置开始播放。这主要是因为需要加载更多数据。 + break; + case Player.STATE_READY://播放器能够从当前位置立即播放。 + if (mActionListener != null) { + mActionListener.onFirstFrame(); + } + break; + case Player.STATE_ENDED://播放器完整播放了所有媒体。 + replay(); + break; + + } + } + + @Override + public void onPlayerError(PlaybackException error) { + Player.Listener.super.onPlayerError(error); + ToastUtil.show(mContext.getResources().getString(R.string.live_play_error)); + } + }); + + placeholderView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH); + placeholderView.requestLayout(); + placeholderView.setKeepContentOnPlayerReset(false); + placeholderView.setPlayer(mPlayer); + placeholderView.setKeepContentOnPlayerReset(true); + + placeholderView.setShowRewindButton(false); + placeholderView.setShowFastForwardButton(false); + placeholderView.setShowPreviousButton(false); + placeholderView.setShowNextButton(false); + placeholderView.setShowShuffleButton(false); + placeholderView.setShowMultiWindowTimeBar(false); + placeholderView.setControllerAutoShow(false); + placeholderView.setUseController(false); + mVideoCover = findViewById(R.id.video_cover); + mVideoCover.setOnClickListener(this); mPlayBtn = findViewById(R.id.btn_play); //暂停按钮动画 mPlayBtnAnimator = ObjectAnimator.ofPropertyValuesHolder(mPlayBtn, PropertyValuesHolder.ofFloat("scaleX", 4f, 0.8f, 1f), PropertyValuesHolder.ofFloat("scaleY", 4f, 0.8f, 1f), PropertyValuesHolder.ofFloat("alpha", 0f, 1f)); @@ -75,102 +122,15 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList mPlayBtnAnimator.setInterpolator(new AccelerateInterpolator()); } - /** - * 播放器事件回调 - */ - @Override - public void onPlayEvent(TXVodPlayer txVodPlayer, int e, Bundle bundle) { - switch (e) { - case TXLiveConstants.PLAY_EVT_PLAY_BEGIN://加载完成,开始播放的回调 - mStartPlay = true; - if (mActionListener != null) { - mActionListener.onPlayBegin(txVodPlayer.getDuration()); - } - if (mActionListener != null) { - mActionListener.onFirstFrame(); - } - break; - case TXLiveConstants.PLAY_EVT_PLAY_LOADING: //开始加载的回调 - if (mActionListener != null) { - mActionListener.onPlayLoading(); - } - break; - case TXLiveConstants.PLAY_EVT_PLAY_END://获取到视频播放完毕的回调 - replay(); - if (!mEndPlay) { - mEndPlay = true; - if (mVideoBean != null) { - VideoHttpUtil.videoWatchEnd(mVideoBean.getUser_id(), mVideoBean.getId()); - } - } - break; - case TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME://获取到视频首帧回调 - if (mActionListener != null) { - mActionListener.onFirstFrame(); - } - if (mPaused && mPlayer != null) { - mPlayer.pause(); - } - break; - case TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION://获取到视频宽高回调 - onVideoSizeChanged( bundle.getInt("EVT_PARAM2", 0),bundle.getInt("EVT_PARAM1", 0)); - break; - case TXLiveConstants.PLAY_EVT_PLAY_PROGRESS: - if (mActionListener != null) { - int progress = bundle.getInt(TXLiveConstants.EVT_PLAY_PROGRESS_MS); - int duration = bundle.getInt(TXLiveConstants.EVT_PLAY_DURATION_MS); - mActionListener.onProgress(progress, duration); - } - break; - } - } - - @Override - public void onNetStatus(TXVodPlayer txVodPlayer, Bundle bundle) { - - } - - /** - * 获取到视频宽高回调 - */ - public void onVideoSizeChanged(float videoWidth, float videoHeight) { - if (mTXCloudVideoView != null && videoWidth > 0 && videoHeight > 0) { - - RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mTXCloudVideoView.getLayoutParams(); - /* - int videoViewHeight = params.height; - int videoViewWidth = params.width; - if (videoWidth < videoViewWidth && videoHeight >= videoViewHeight) { - params.width = (int) (videoViewHeight / (videoHeight / videoViewHeight)); - } else if (videoWidth > videoViewWidth && videoHeight >= videoViewHeight) { - params.width = (int) (videoViewHeight / (videoHeight / videoWidth)); - } - mTXCloudVideoView.requestLayout(); - if (mVideoCover != null && mVideoCover.getVisibility() == View.VISIBLE) { - mVideoCover.setVisibility(View.INVISIBLE); - }*/ - int targetH = 0; - if (videoWidth / videoHeight > 0.5625f) {//横屏 9:16=0.5625 - /*targetH = (int) (videoHeight*(videoWidth/videoHeight));*/ - targetH = (int) (mTXCloudVideoView.getWidth() / videoWidth * videoHeight); - } else { - targetH = ViewGroup.LayoutParams.MATCH_PARENT; - } - if (targetH != params.height) { - params.height = targetH; - mTXCloudVideoView.requestLayout(); - } - if (mVideoCover != null && mVideoCover.getVisibility() == View.VISIBLE) { - mVideoCover.setVisibility(View.INVISIBLE); - } - } + private MediaItem createMediaItem(String url) { + return MediaItem.fromUri(url); } /** * 开始播放 */ public void startPlay(ActiveBean videoBean) { - mStartPlay = false; + mStartPlay = true; mClickPaused = false; mEndPlay = false; mVideoBean = videoBean; @@ -178,28 +138,14 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList mVideoCover.setVisibility(View.VISIBLE); } hidePlayBtn(); + if (mPlayer.isPlaying()) { + mPlayer.stop(); + } L.e("播放视频--->" + videoBean); - if (videoBean == null) { - return; - } - String url = videoBean.getVideo(); - if (TextUtils.isEmpty(url)) { - return; - } - if (mTXVodPlayConfig == null) { - mTXVodPlayConfig = new TXVodPlayConfig(); - mTXVodPlayConfig.setMaxCacheItems(15); - mTXVodPlayConfig.setProgressInterval(200); - } - if (url.endsWith(".m3u8")) { - mTXVodPlayConfig.setCacheFolderPath(null); - } else { - mTXVodPlayConfig.setCacheFolderPath(mCachePath); - } - mPlayer.setConfig(mTXVodPlayConfig); - if (mPlayer != null) { - mPlayer.startPlay(url); - } + mPlayer.setMediaItem(createMediaItem(videoBean.getVideo())); + mPlayer.prepare(); + mPlayer.play(); + VideoHttpUtil.videoWatchStart(videoBean.getUser_id(), videoBean.getId()); } @@ -208,7 +154,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList */ public void stopPlay() { if (mPlayer != null) { - mPlayer.stopPlay(false); + mPlayer.stop(); } } @@ -217,8 +163,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList */ private void replay() { if (mPlayer != null) { - mPlayer.seek(0); - mPlayer.resume(); + startPlay(mVideoBean); } } @@ -226,8 +171,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList VideoHttpUtil.cancel(VideoHttpConsts.VIDEO_WATCH_START); VideoHttpUtil.cancel(VideoHttpConsts.VIDEO_WATCH_END); if (mPlayer != null) { - mPlayer.stopPlay(false); - mPlayer.setPlayListener(null); + mPlayer.stop(); } mPlayer = null; mActionListener = null; @@ -249,7 +193,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList public void resumePlay() { if (mPaused) { if (!mClickPaused && mPlayer != null) { - mPlayer.resume(); + mPlayer.play(); } } mPaused = false; @@ -283,7 +227,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList } if (mPlayer != null) { if (mClickPaused) { - mPlayer.resume(); + mPlayer.play(); } else { mPlayer.pause(); } @@ -302,7 +246,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList @Override public void onClick(View v) { int i = v.getId(); - if (i == R.id.root) { + if (i == R.id.video_cover) { clickTogglePlay(); } } diff --git a/video/src/main/java/com/yunbao/video/views/VideoPlayWrapViewHolder.java b/video/src/main/java/com/yunbao/video/views/VideoPlayWrapViewHolder.java index 81c34e02c..0d6ffc6b0 100644 --- a/video/src/main/java/com/yunbao/video/views/VideoPlayWrapViewHolder.java +++ b/video/src/main/java/com/yunbao/video/views/VideoPlayWrapViewHolder.java @@ -57,7 +57,7 @@ import java.util.List; public class VideoPlayWrapViewHolder extends AbsViewHolder implements View.OnClickListener { private ViewGroup mVideoContainer; - private ImageView mCover; + private MyImageView mCover; private ImageView mAvatar; private TextView mName; private TextView mTitle; @@ -101,7 +101,7 @@ public class VideoPlayWrapViewHolder extends AbsViewHolder implements View.OnCli progressCount = (TextView) findViewById(R.id.progressCount); mVideoContainer = (ViewGroup) findViewById(R.id.video_container); - mCover = (ImageView) findViewById(R.id.cover); + mCover = (MyImageView) findViewById(R.id.cover); mAvatar = (ImageView) findViewById(R.id.avatar); mName = (TextView) findViewById(R.id.name); mTitle = (TextView) findViewById(R.id.title); @@ -303,6 +303,20 @@ public class VideoPlayWrapViewHolder extends AbsViewHolder implements View.OnCli mCover.requestLayout(); } mCover.setImageDrawable(drawable); + + /* + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mCover.getLayoutParams(); + + int imageWidth = drawable.getIntrinsicWidth(); + int imageHeight = drawable.getIntrinsicHeight(); + + //宽度固定,然后根据原始宽高比得到此固定宽度需要的高度 + //screenWidth 是屏幕宽度 + int height = mCover.getWidth() * imageHeight / imageWidth; + ViewGroup.LayoutParams para = mCover.getLayoutParams(); + para.height = height; + para.width = mCover.getWidth();*/ + //mCover.setImageDrawable(drawable); } } diff --git a/video/src/main/res/layout/activity_video_new_play.xml b/video/src/main/res/layout/activity_video_new_play.xml new file mode 100644 index 000000000..90f3c3360 --- /dev/null +++ b/video/src/main/res/layout/activity_video_new_play.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/video/src/main/res/layout/view_video_play.xml b/video/src/main/res/layout/view_video_play.xml index 1dcc7b312..69aed52e2 100644 --- a/video/src/main/res/layout/view_video_play.xml +++ b/video/src/main/res/layout/view_video_play.xml @@ -1,20 +1,20 @@ - + android:layout_height="match_parent" /> + android:background="@color/transparent" /> - \ No newline at end of file diff --git a/video/src/main/res/layout/view_video_play_wrap.xml b/video/src/main/res/layout/view_video_play_wrap.xml index d3c4b19cb..5c6e17128 100644 --- a/video/src/main/res/layout/view_video_play_wrap.xml +++ b/video/src/main/res/layout/view_video_play_wrap.xml @@ -10,12 +10,11 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - + android:layout_centerInParent="true" />