Skip to content

Instantly share code, notes, and snippets.

@brAzzi64
Created December 2, 2019 19:53
Show Gist options
  • Save brAzzi64/d9aa2caedff9dbcc7b04d182add83897 to your computer and use it in GitHub Desktop.
Save brAzzi64/d9aa2caedff9dbcc7b04d182add83897 to your computer and use it in GitHub Desktop.
From 39a89e037d5a2f66f353e34deb6eab176e88dbc1 Mon Sep 17 00:00:00 2001
From: Bruno Azzinnari <brazzi@fb.com>
Date: Thu, 21 Nov 2019 11:59:26 -0800
Subject: [PATCH] Playing Merge(Clip(Audio), Clip(Video))
---
.../android/exoplayer2/demo/PlayerActivity.java | 52 ++++++++++++++++------
1 file changed, 39 insertions(+), 13 deletions(-)
diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
index 35307eb5d..091f0d827 100644
--- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
+++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
@@ -48,8 +48,10 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryExcep
import com.google.android.exoplayer2.offline.DownloadHelper;
import com.google.android.exoplayer2.offline.DownloadRequest;
import com.google.android.exoplayer2.source.BehindLiveWindowException;
+import com.google.android.exoplayer2.source.ClippingMediaSource;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
+import com.google.android.exoplayer2.source.MergingMediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.ads.AdsLoader;
@@ -78,7 +80,9 @@ import java.net.CookieManager;
import java.net.CookiePolicy;
import java.util.UUID;
-/** An activity that plays media using {@link SimpleExoPlayer}. */
+/**
+ * An activity that plays media using {@link SimpleExoPlayer}.
+ */
public class PlayerActivity extends AppCompatActivity
implements OnClickListener, PlaybackPreparer, PlayerControlView.VisibilityListener {
@@ -117,6 +121,7 @@ public class PlayerActivity extends AppCompatActivity
private static final String KEY_AUTO_PLAY = "auto_play";
private static final CookieManager DEFAULT_COOKIE_MANAGER;
+
static {
DEFAULT_COOKIE_MANAGER = new CookieManager();
DEFAULT_COOKIE_MANAGER.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
@@ -330,8 +335,8 @@ public class PlayerActivity extends AppCompatActivity
Uri[] uris;
String[] extensions;
if (ACTION_VIEW.equals(action)) {
- uris = new Uri[] {intent.getData()};
- extensions = new String[] {intent.getStringExtra(EXTENSION_EXTRA)};
+ uris = new Uri[]{intent.getData()};
+ extensions = new String[]{intent.getStringExtra(EXTENSION_EXTRA)};
} else if (ACTION_VIEW_LIST.equals(action)) {
String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA);
uris = new Uri[uriStrings.length];
@@ -421,12 +426,28 @@ public class PlayerActivity extends AppCompatActivity
debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start();
- MediaSource[] mediaSources = new MediaSource[uris.length];
- for (int i = 0; i < uris.length; i++) {
- mediaSources[i] = buildMediaSource(uris[i], extensions[i]);
- }
- mediaSource =
- mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources);
+ // My custom-built media sources:
+ Uri audioUri = Uri.parse(
+ "https://storage.googleapis.com/exoplayer-test-media-1/gen-3/screens/dash-vod-single-segment/audio-141.mp4");
+ MediaSource audioMediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
+ .createMediaSource(audioUri);
+ audioMediaSource = new ClippingMediaSource(audioMediaSource, 15_000_000,
+ 15_000_000 + 3_000_000);
+
+ Uri videoUri = Uri.parse(
+ "https://storage.googleapis.com/exoplayer-test-media-1/gen-3/screens/dash-vod-single-segment/video-avc-baseline-480.mp4");
+ MediaSource videoMediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
+ .createMediaSource(videoUri);
+ videoMediaSource = new ClippingMediaSource(videoMediaSource, 1_000_000,
+ 1_000_000 + 3_000_000);
+
+ // Audio plays, clipped to the right segment, but video is black.
+ //mediaSource = new MergingMediaSource(audioMediaSource, videoMediaSource);
+
+ // Video plays, audio plays but from the beginning. Seekbar reports 3 secs,
+ // but audio continues to play for a bit after video freezes at time=3sec.
+ mediaSource = new MergingMediaSource(videoMediaSource, audioMediaSource);
+
String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA);
if (adTagUriString != null) {
Uri adTagUri = Uri.parse(adTagUriString);
@@ -548,13 +569,18 @@ public class PlayerActivity extends AppCompatActivity
startPosition = C.TIME_UNSET;
}
- /** Returns a new DataSource factory. */
+ /**
+ * Returns a new DataSource factory.
+ */
private DataSource.Factory buildDataSourceFactory() {
return ((DemoApplication) getApplication()).buildDataSourceFactory();
}
- /** Returns an ads media source, reusing the ads loader if one exists. */
- private @Nullable MediaSource createAdsMediaSource(MediaSource mediaSource, Uri adTagUri) {
+ /**
+ * Returns an ads media source, reusing the ads loader if one exists.
+ */
+ private @Nullable
+ MediaSource createAdsMediaSource(MediaSource mediaSource, Uri adTagUri) {
// Load the extension source using reflection so the demo app doesn't have to depend on it.
// The ads loader is reused for multiple playbacks, so that ad playback can resume.
try {
@@ -579,7 +605,7 @@ public class PlayerActivity extends AppCompatActivity
@Override
public int[] getSupportedTypes() {
- return new int[] {C.TYPE_DASH, C.TYPE_SS, C.TYPE_HLS, C.TYPE_OTHER};
+ return new int[]{C.TYPE_DASH, C.TYPE_SS, C.TYPE_HLS, C.TYPE_OTHER};
}
};
return new AdsMediaSource(mediaSource, adMediaSourceFactory, adsLoader, playerView);
--
2.13.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment