diff --git a/README.md b/README.md index ec256ae5..bb534a0a 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,9 @@ A video player for Android. ![Maven Central](https://img.shields.io/maven-central/v/xyz.doikki.android.dkplayer/dkplayer-java) [![API](https://img.shields.io/badge/API-16%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=16) - - ### 中文 | [English](https://github.com/Doikki/DKVideoPlayer/blob/master/README-en.md) -### [Demo](https://d.7short.com/qwtj) +### [Demo](https://www.pgyer.com/EGTZ) ### [特性](https://github.com/Doikki/DKVideoPlayer/wiki#%E7%89%B9%E6%80%A7) diff --git a/build.gradle b/build.gradle index 6aea7293..cca41d89 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.32' + ext.kotlin_version = '1.6.21' repositories { google() mavenCentral() // mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' + classpath 'com.android.tools.build:gradle:7.1.2' // maven publish tool classpath 'org.jetbrains.dokka:dokka-gradle-plugin:1.4.30' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/constants.gradle b/constants.gradle index 9ccc30d8..04bc8e6a 100644 --- a/constants.gradle +++ b/constants.gradle @@ -1,13 +1,13 @@ project.ext { - releaseVersion = '3.3.5' - releaseVersionCode = 53 + releaseVersion = '3.3.6' + releaseVersionCode = 54 minSdkVersion = 16 - targetSdkVersion = 30 - compileSdkVersion = 30 - buildToolsVersion = '28.0.3' + targetSdkVersion = 31 + compileSdkVersion = 31 + buildToolsVersion = '33.0.0' - exoPlayerVersion = '2.14.2' + exoPlayerVersion = '2.18.0' annotation = 'androidx.annotation:annotation:1.1.0' } \ No newline at end of file diff --git a/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java b/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java index f40a6881..2d2c4c53 100644 --- a/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java +++ b/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayer.java @@ -7,13 +7,13 @@ import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.DefaultRenderersFactory; -import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.DefaultAnalyticsCollector; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; @@ -33,7 +33,7 @@ public class ExoMediaPlayer extends AbstractPlayer implements Player.Listener { protected Context mAppContext; - protected SimpleExoPlayer mInternalPlayer; + protected ExoPlayer mInternalPlayer; protected MediaSource mMediaSource; protected ExoMediaSourceHelper mMediaSourceHelper; @@ -52,14 +52,14 @@ public ExoMediaPlayer(Context context) { @Override public void initPlayer() { - mInternalPlayer = new SimpleExoPlayer.Builder( + mInternalPlayer = new ExoPlayer.Builder( mAppContext, mRenderersFactory == null ? mRenderersFactory = new DefaultRenderersFactory(mAppContext) : mRenderersFactory, - mTrackSelector == null ? mTrackSelector = new DefaultTrackSelector(mAppContext) : mTrackSelector, new DefaultMediaSourceFactory(mAppContext), + mTrackSelector == null ? mTrackSelector = new DefaultTrackSelector(mAppContext) : mTrackSelector, mLoadControl == null ? mLoadControl = new DefaultLoadControl() : mLoadControl, DefaultBandwidthMeter.getSingletonInstance(mAppContext), - new AnalyticsCollector(Clock.DEFAULT)) + new DefaultAnalyticsCollector(Clock.DEFAULT)) .build(); setOptions(); @@ -268,11 +268,13 @@ public void onPlaybackStateChanged(int playbackState) { case Player.STATE_ENDED: mPlayerEventListener.onCompletion(); break; + case Player.STATE_IDLE: + break; } } @Override - public void onPlayerError(ExoPlaybackException error) { + public void onPlayerError(PlaybackException error) { if (mPlayerEventListener != null) { mPlayerEventListener.onError(); } diff --git a/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java b/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java index 0de1b282..b93bdd34 100644 --- a/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java +++ b/dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaSourceHelper.java @@ -6,15 +6,15 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.database.ExoDatabaseProvider; -import com.google.android.exoplayer2.ext.rtmp.RtmpDataSourceFactory; +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; +import com.google.android.exoplayer2.ext.rtmp.RtmpDataSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.source.rtsp.RtspMediaSource; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.cache.Cache; @@ -29,7 +29,7 @@ public final class ExoMediaSourceHelper { - private static ExoMediaSourceHelper sInstance; + private static volatile ExoMediaSourceHelper sInstance; private final String mUserAgent; private final Context mAppContext; @@ -67,7 +67,7 @@ public MediaSource getMediaSource(String uri, boolean isCache) { public MediaSource getMediaSource(String uri, Map headers, boolean isCache) { Uri contentUri = Uri.parse(uri); if ("rtmp".equals(contentUri.getScheme())) { - return new ProgressiveMediaSource.Factory(new RtmpDataSourceFactory(null)) + return new ProgressiveMediaSource.Factory(new RtmpDataSource.Factory()) .createMediaSource(MediaItem.fromUri(contentUri)); } else if ("rtsp".equals(contentUri.getScheme())) { return new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(contentUri)); @@ -83,12 +83,12 @@ public MediaSource getMediaSource(String uri, Map headers, boole setHeaders(headers); } switch (contentType) { - case C.TYPE_DASH: + case C.CONTENT_TYPE_DASH: return new DashMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(contentUri)); - case C.TYPE_HLS: + case C.CONTENT_TYPE_HLS: return new HlsMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(contentUri)); default: - case C.TYPE_OTHER: + case C.CONTENT_TYPE_OTHER: return new ProgressiveMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(contentUri)); } } @@ -96,11 +96,11 @@ public MediaSource getMediaSource(String uri, Map headers, boole private int inferContentType(String fileName) { fileName = fileName.toLowerCase(); if (fileName.contains(".mpd")) { - return C.TYPE_DASH; + return C.CONTENT_TYPE_DASH; } else if (fileName.contains(".m3u8")) { - return C.TYPE_HLS; + return C.CONTENT_TYPE_HLS; } else { - return C.TYPE_OTHER; + return C.CONTENT_TYPE_OTHER; } } @@ -118,7 +118,7 @@ private Cache newCache() { return new SimpleCache( new File(mAppContext.getExternalCacheDir(), "exo-video-cache"),//缓存目录 new LeastRecentlyUsedCacheEvictor(512 * 1024 * 1024),//缓存大小,默认512M,使用LRU算法实现 - new ExoDatabaseProvider(mAppContext)); + new StandaloneDatabaseProvider(mAppContext)); } /** @@ -127,7 +127,7 @@ private Cache newCache() { * @return A new DataSource factory. */ private DataSource.Factory getDataSourceFactory() { - return new DefaultDataSourceFactory(mAppContext, getHttpDataSourceFactory()); + return new DefaultDataSource.Factory(mAppContext, getHttpDataSourceFactory()); } /** diff --git a/dkplayer-sample/build.gradle b/dkplayer-sample/build.gradle index 32af1f84..4da16dfb 100644 --- a/dkplayer-sample/build.gradle +++ b/dkplayer-sample/build.gradle @@ -96,9 +96,9 @@ dependencies { implementation project(':dkplayer-videocache') -// implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.5' -// implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.5' -// implementation 'xyz.doikki.android.dkplayer:player-exo:3.3.5' -// implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.5' -// implementation 'xyz.doikki.android.dkplayer:videocache:3.3.5' +// implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.6' +// implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.6' +// implementation 'xyz.doikki.android.dkplayer:player-exo:3.3.6' +// implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.6' +// implementation 'xyz.doikki.android.dkplayer:videocache:3.3.6' } diff --git a/dkplayer-sample/src/main/AndroidManifest.xml b/dkplayer-sample/src/main/AndroidManifest.xml index d968b6a8..fd0e791e 100644 --- a/dkplayer-sample/src/main/AndroidManifest.xml +++ b/dkplayer-sample/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + @@ -49,6 +50,7 @@ diff --git a/dkplayer-ui/src/main/java/xyz/doikki/videocontroller/component/VodControlView.java b/dkplayer-ui/src/main/java/xyz/doikki/videocontroller/component/VodControlView.java index d772ee92..8f1eb07d 100644 --- a/dkplayer-ui/src/main/java/xyz/doikki/videocontroller/component/VodControlView.java +++ b/dkplayer-ui/src/main/java/xyz/doikki/videocontroller/component/VodControlView.java @@ -17,6 +17,7 @@ import android.widget.SeekBar; import android.widget.TextView; +import androidx.annotation.BoolRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -162,8 +163,14 @@ public void onPlayStateChanged(int playState) { mPlayButton.setSelected(false); break; case VideoView.STATE_BUFFERING: + mPlayButton.setSelected(mControlWrapper.isPlaying()); + // 停止刷新进度 + mControlWrapper.stopProgress(); + break; case VideoView.STATE_BUFFERED: mPlayButton.setSelected(mControlWrapper.isPlaying()); + //开始刷新进度 + mControlWrapper.startProgress(); break; } } @@ -265,7 +272,6 @@ public void onStopTrackingTouch(SeekBar seekBar) { long newPosition = (duration * seekBar.getProgress()) / mVideoProgress.getMax(); mControlWrapper.seekTo((int) newPosition); mIsDragging = false; - mControlWrapper.startProgress(); mControlWrapper.startFadeOut(); } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bb7bdcaa..6e4fd9af 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Apr 20 23:16:41 CST 2021 +#Sat Jun 11 20:36:29 CST 2022 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +zipStoreBase=GRADLE_USER_HOME