diff --git a/demo/src/main/java/hybridmediaplayer/demo/MainActivity.java b/demo/src/main/java/hybridmediaplayer/demo/MainActivity.java index aba12dd..f3705d4 100644 --- a/demo/src/main/java/hybridmediaplayer/demo/MainActivity.java +++ b/demo/src/main/java/hybridmediaplayer/demo/MainActivity.java @@ -118,7 +118,7 @@ private void createPlayer() { mediaPlayer.stop(); mediaPlayer.release(); } - String url = "http://217.74.72.11/RADIOFONIA"; + String url = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"; String url2 = "http://217.74.72.11/RADIOFONIA"; String url3 = "https://github.com/mediaelement/mediaelement-files/blob/master/big_buck_bunny.mp4?raw=true"; @@ -224,7 +224,8 @@ public void onClick(View view) { KLog.i(mediaPlayer.getDuration()); } } else if (view.getId() == R.id.fastForward) { - mediaPlayer.seekTo(mediaPlayer.getDuration() - 1500); + mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + 1500); + KLog.e(mediaPlayer.getCurrentPlayer().getCurrentWindowIndex()); // mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + 2000); } else if (view.getId() == R.id.btSpeed) { // loadOtherSources(); @@ -252,7 +253,6 @@ public void onClick(View view) { KLog.d(mediaPlayer.getCurrentWindow()); KLog.i("abc " + (mediaPlayer.getCurrentWindow() + 1) % mediaPlayer.getWindowCount() + " / " + mediaPlayer.getWindowCount()); mediaPlayer.seekTo((mediaPlayer.getCurrentWindow() + 1) % mediaPlayer.getWindowCount(), 0); - mediaPlayer.seekTo(1000); KLog.i(mediaPlayer.getCurrentPlayer().getPlaybackState()); // KLog.i(mediaPlayer.getCurrentPlayer().getPlaybackError()); } else if (view.getId() == R.id.btCreatePlayer) { diff --git a/hybridmediaplayer/build.gradle b/hybridmediaplayer/build.gradle index 653f0ad..b840bf4 100644 --- a/hybridmediaplayer/build.gradle +++ b/hybridmediaplayer/build.gradle @@ -4,11 +4,11 @@ apply plugin: 'com.github.dcendents.android-maven' group = 'com.github.mkaflowski' android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { minSdkVersion 16 - targetSdkVersion 30 + targetSdkVersion 31 versionCode 1 versionName "1.0" @@ -37,13 +37,10 @@ dependencies { }) testImplementation 'junit:junit:4.12' - implementation 'com.android.support:support-compat:28.0.0' implementation 'com.github.zhaokaiqiang.klog:library:1.6.0' api 'com.google.android.exoplayer:exoplayer:2.15.0' api "com.google.android.exoplayer:extension-mediasession:2.15.0" - api 'com.google.android.exoplayer:extension-cast:2.14.0' - - api 'com.google.android.gms:play-services-cast-framework:20.0.0' + api 'com.google.android.exoplayer:extension-cast:2.15.0' } diff --git a/hybridmediaplayer/src/main/java/hybridmediaplayer/ExoMediaPlayer.java b/hybridmediaplayer/src/main/java/hybridmediaplayer/ExoMediaPlayer.java index 9d71e08..b4c9cc0 100644 --- a/hybridmediaplayer/src/main/java/hybridmediaplayer/ExoMediaPlayer.java +++ b/hybridmediaplayer/src/main/java/hybridmediaplayer/ExoMediaPlayer.java @@ -7,8 +7,9 @@ import android.os.Handler; import android.view.SurfaceView; -import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; @@ -31,15 +32,11 @@ import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; -import com.google.android.gms.cast.MediaInfo; -import com.google.android.gms.cast.MediaMetadata; -import com.google.android.gms.cast.MediaQueueItem; import com.google.android.gms.cast.MediaStatus; import com.google.android.gms.cast.framework.CastContext; import com.google.android.gms.cast.framework.CastSession; import com.google.android.gms.cast.framework.SessionManager; import com.google.android.gms.cast.framework.media.RemoteMediaClient; -import com.google.android.gms.common.images.WebImage; import com.socks.library.KLog; import java.util.ArrayList; @@ -58,7 +55,7 @@ public class ExoMediaPlayer extends HybridMediaPlayer implements SessionAvailabi private Context context; private MediaSource exoMediaSource; - private MediaQueueItem[] mediaItems = new MediaQueueItem[0]; + private List mediaItems; private int currentState; private boolean isPreparing = false; private OnTrackChangedListener onTrackChangedListener; @@ -184,31 +181,41 @@ private void init() { private void prepareCastMediaSourceInfoList(List mediaSourceInfoList) { this.mediaSourceInfoList = mediaSourceInfoList; //media sources for CastPlayer - mediaItems = new MediaQueueItem[mediaSourceInfoList.size()]; + mediaItems = new ArrayList<>(); for (int i = 0; i < mediaSourceInfoList.size(); i++) { - mediaItems[i] = buildMediaQueueItem(mediaSourceInfoList.get(i).getUrl(), mediaSourceInfoList.get(i), i + 1); + MediaItem mediaItem = buildMediaQueueItem(mediaSourceInfoList.get(i), i + 1); + mediaItems.add(mediaItem); } } - private MediaQueueItem buildMediaQueueItem(String url, MediaSourceInfo mediaSourceInfo, int position) { + private MediaItem buildMediaQueueItem(MediaSourceInfo mediaSourceInfo, int position) { if (mediaSourceInfo == null) mediaSourceInfo = MediaSourceInfo.PLACEHOLDER; - MediaMetadata movieMetadata = new MediaMetadata(mediaSourceInfo.isVideo() ? MediaMetadata.MEDIA_TYPE_MOVIE : MediaMetadata.MEDIA_TYPE_MUSIC_TRACK); - movieMetadata.putString(MediaMetadata.KEY_TITLE, mediaSourceInfo.getTitle()); - movieMetadata.putString(MediaMetadata.KEY_ALBUM_ARTIST, mediaSourceInfo.getAuthor()); - movieMetadata.putInt(MediaMetadata.KEY_TRACK_NUMBER, position); - String imageUrl = mediaSourceInfo.getImageUrl(); - if (imageUrl != null) { - Uri parse = Uri.parse(imageUrl); - movieMetadata.addImage(new WebImage(parse)); - } - MediaInfo mediaInfo = new MediaInfo.Builder(url) - .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) - .setContentType(mediaSourceInfo.isVideo() ? MimeTypes.VIDEO_UNKNOWN : MimeTypes.AUDIO_UNKNOWN) - .setMetadata(movieMetadata).build(); + MediaMetadata.Builder movieMetadata = new MediaMetadata.Builder(); + movieMetadata.setTitle(mediaSourceInfo.getTitle()); + movieMetadata.setArtist(mediaSourceInfo.getAuthor()); + +// MediaMetadata movieMetadata = new MediaMetadata(mediaSourceInfo.isVideo() ? MediaMetadata.MEDIA_TYPE_MOVIE : MediaMetadata.MEDIA_TYPE_MUSIC_TRACK); +// movieMetadata.putString(MediaMetadata.KEY_TITLE, mediaSourceInfo.getTitle()); +// movieMetadata.putString(MediaMetadata.KEY_ALBUM_ARTIST, mediaSourceInfo.getAuthor()); +// movieMetadata.putInt(MediaMetadata.KEY_TRACK_NUMBER, position); +// String imageUrl = mediaSourceInfo.getImageUrl(); +// if (imageUrl != null) { +// Uri parse = Uri.parse(imageUrl); +// movieMetadata.addImage(new WebImage(parse)); +// } +// MediaInfo mediaInfo = new MediaInfo.Builder(url) +// .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) +// .setContentType(mediaSourceInfo.isVideo() ? MimeTypes.VIDEO_UNKNOWN : MimeTypes.AUDIO_UNKNOWN) +// .setMetadata(movieMetadata).build(); - return new MediaQueueItem.Builder(mediaInfo).build(); + MediaItem.Builder builder = new MediaItem.Builder(); + builder.setMimeType(mediaSourceInfo.isVideo() ? MimeTypes.VIDEO_UNKNOWN : MimeTypes.AUDIO_UNKNOWN); + builder.setUri(mediaSourceInfo.getUrl()); + builder.setMediaMetadata(movieMetadata.build()); + + return builder.build(); } @@ -237,14 +244,26 @@ public void onAudioSessionIdChanged(EventTime eventTime, int audioSessionId) { init(); if (castPlayer != null && isCasting()) { - castPlayer.loadItems(mediaItems, initialWindowNum, 0, Player.REPEAT_MODE_OFF); -// castPlayer.setPlayWhenReady(true); + castPlayer.setPlayWhenReady(true); } if (onTrackChangedListener != null) onTrackChangedListener.onTrackChanged(false); } + private void setCastItems() { +// castPlayer.clearMediaItems(); + ArrayList mediaItemsCast = new ArrayList<>(); + int i = 0; + for (MediaSourceInfo mediaItem : mediaSourceInfoList) { + mediaItemsCast.add(buildMediaQueueItem(mediaItem, i)); + i++; + } + KLog.d(mediaItemsCast.size()); + castPlayer.setMediaItems(mediaItemsCast, currentWindow, exoPlayer.getCurrentPosition()); + castPlayer.play(); + } + private void setEqualizer() { if (!isSupportingSystemEqualizer) return; @@ -315,7 +334,8 @@ public void seekTo(int windowIndex, int msec) { } try { if (currentPlayer == castPlayer) - castPlayer.loadItems(mediaItems, windowIndex, msec, Player.REPEAT_MODE_OFF); + castPlayer.seekTo(windowIndex, msec); +// castPlayer.loadItems(mediaItems, windowIndex, msec, Player.REPEAT_MODE_OFF); else currentPlayer.seekTo(windowIndex, msec); } catch (ArrayIndexOutOfBoundsException e) { @@ -399,13 +419,17 @@ public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandling @Override public void onCastSessionAvailable() { - setCurrentPlayer(castPlayer); + KLog.d(); + if (currentPlayer != castPlayer) + setCurrentPlayer(castPlayer); if (onCastAvailabilityChangeListener != null) onCastAvailabilityChangeListener.onCastAvailabilityChange(true); } @Override public void onCastSessionUnavailable() { + KLog.e(castPlayer.getCurrentWindowIndex()); + KLog.e(exoPlayer.getCurrentWindowIndex()); setCurrentPlayer(exoPlayer); if (onCastAvailabilityChangeListener != null) onCastAvailabilityChangeListener.onCastAvailabilityChange(false); @@ -426,18 +450,21 @@ private void setCurrentPlayer(Player player) { long time = currentPlayer.getCurrentPosition(); int window = currentPlayer.getCurrentWindowIndex(); + KLog.d(window); + KLog.i(time); + currentPlayer = player; isPreparing = true; - if (currentPlayer == castPlayer) { + KLog.d(); isCasting = true; - if (mediaItems.length != 0) - castPlayer.loadItems(mediaItems, window, time, Player.REPEAT_MODE_OFF); + if (mediaItems != null && mediaItems.size() != 0) + setCastItems(); } if (currentPlayer == exoPlayer) { - seekTo(window, (int) time); + seekTo(currentWindow, (int) time); if (shouldPlay) play(); else