Use media item in the cast demo app
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=214750185
This commit is contained in:
parent
d487b599f8
commit
2a50621118
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.castdemo;
|
package com.google.android.exoplayer2.castdemo;
|
||||||
|
|
||||||
|
import com.google.android.exoplayer2.ext.cast.MediaItem;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.gms.cast.MediaInfo;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -31,57 +31,45 @@ import java.util.List;
|
|||||||
public static final String MIME_TYPE_SS = MimeTypes.APPLICATION_SS;
|
public static final String MIME_TYPE_SS = MimeTypes.APPLICATION_SS;
|
||||||
public static final String MIME_TYPE_VIDEO_MP4 = MimeTypes.VIDEO_MP4;
|
public static final String MIME_TYPE_VIDEO_MP4 = MimeTypes.VIDEO_MP4;
|
||||||
|
|
||||||
/**
|
/** The list of samples available in the cast demo app. */
|
||||||
* The list of samples available in the cast demo app.
|
public static final List<MediaItem> SAMPLES;
|
||||||
*/
|
|
||||||
public static final List<Sample> SAMPLES;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a media sample.
|
|
||||||
*/
|
|
||||||
public static final class Sample {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The uri from which the media sample is obtained.
|
|
||||||
*/
|
|
||||||
public final String uri;
|
|
||||||
/**
|
|
||||||
* A descriptive name for the sample.
|
|
||||||
*/
|
|
||||||
public final String name;
|
|
||||||
/**
|
|
||||||
* The mime type of the media sample, as required by {@link MediaInfo#setContentType}.
|
|
||||||
*/
|
|
||||||
public final String mimeType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param uri See {@link #uri}.
|
|
||||||
* @param name See {@link #name}.
|
|
||||||
* @param mimeType See {@link #mimeType}.
|
|
||||||
*/
|
|
||||||
public Sample(String uri, String name, String mimeType) {
|
|
||||||
this.uri = uri;
|
|
||||||
this.name = name;
|
|
||||||
this.mimeType = mimeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// App samples.
|
// App samples.
|
||||||
ArrayList<Sample> samples = new ArrayList<>();
|
ArrayList<MediaItem> samples = new ArrayList<>();
|
||||||
samples.add(new Sample("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd",
|
MediaItem.Builder sampleBuilder = new MediaItem.Builder();
|
||||||
"DASH (clear,MP4,H264)", MIME_TYPE_DASH));
|
|
||||||
samples.add(new Sample("https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/"
|
|
||||||
+ "hls/TearsOfSteel.m3u8", "Tears of Steel (HLS)", MIME_TYPE_HLS));
|
|
||||||
samples.add(new Sample("https://html5demos.com/assets/dizzy.mp4", "Dizzy (MP4)",
|
|
||||||
MIME_TYPE_VIDEO_MP4));
|
|
||||||
|
|
||||||
|
samples.add(
|
||||||
|
sampleBuilder
|
||||||
|
.setTitle("DASH (clear,MP4,H264)")
|
||||||
|
.setMimeType(MIME_TYPE_DASH)
|
||||||
|
.setMedia("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd")
|
||||||
|
.buildAndClear());
|
||||||
|
|
||||||
|
samples.add(
|
||||||
|
sampleBuilder
|
||||||
|
.setTitle("Tears of Steel (HLS)")
|
||||||
|
.setMimeType(MIME_TYPE_HLS)
|
||||||
|
.setMedia(
|
||||||
|
"https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/"
|
||||||
|
+ "hls/TearsOfSteel.m3u8")
|
||||||
|
.buildAndClear());
|
||||||
|
|
||||||
|
samples.add(
|
||||||
|
sampleBuilder
|
||||||
|
.setTitle("HLS Basic (TS)")
|
||||||
|
.setMimeType(MIME_TYPE_HLS)
|
||||||
|
.setMedia(
|
||||||
|
"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3"
|
||||||
|
+ "/bipbop_4x3_variant.m3u8")
|
||||||
|
.buildAndClear());
|
||||||
|
|
||||||
|
samples.add(
|
||||||
|
sampleBuilder
|
||||||
|
.setTitle("Dizzy (MP4)")
|
||||||
|
.setMimeType(MIME_TYPE_VIDEO_MP4)
|
||||||
|
.setMedia("https://html5demos.com/assets/dizzy.mp4")
|
||||||
|
.buildAndClear());
|
||||||
|
|
||||||
SAMPLES = Collections.unmodifiableList(samples);
|
SAMPLES = Collections.unmodifiableList(samples);
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ package com.google.android.exoplayer2.castdemo;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.graphics.ColorUtils;
|
import android.support.v4.graphics.ColorUtils;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
@ -35,18 +36,18 @@ import android.widget.ListView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||||
import com.google.android.exoplayer2.castdemo.DemoUtil.Sample;
|
import com.google.android.exoplayer2.ext.cast.MediaItem;
|
||||||
import com.google.android.exoplayer2.ext.cast.CastPlayer;
|
|
||||||
import com.google.android.exoplayer2.ui.PlayerControlView;
|
import com.google.android.exoplayer2.ui.PlayerControlView;
|
||||||
import com.google.android.exoplayer2.ui.PlayerView;
|
import com.google.android.exoplayer2.ui.PlayerView;
|
||||||
import com.google.android.gms.cast.framework.CastButtonFactory;
|
import com.google.android.gms.cast.framework.CastButtonFactory;
|
||||||
import com.google.android.gms.cast.framework.CastContext;
|
import com.google.android.gms.cast.framework.CastContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity that plays video using {@link SimpleExoPlayer} and {@link CastPlayer}.
|
* An activity that plays video using {@link SimpleExoPlayer} and supports casting using ExoPlayer's
|
||||||
|
* Cast extension.
|
||||||
*/
|
*/
|
||||||
public class MainActivity extends AppCompatActivity implements OnClickListener,
|
public class MainActivity extends AppCompatActivity
|
||||||
PlayerManager.QueuePositionListener {
|
implements OnClickListener, PlayerManager.QueuePositionListener {
|
||||||
|
|
||||||
private PlayerView localPlayerView;
|
private PlayerView localPlayerView;
|
||||||
private PlayerControlView castControlView;
|
private PlayerControlView castControlView;
|
||||||
@ -181,7 +182,7 @@ public class MainActivity extends AppCompatActivity implements OnClickListener,
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(QueueItemViewHolder holder, int position) {
|
public void onBindViewHolder(QueueItemViewHolder holder, int position) {
|
||||||
TextView view = holder.textView;
|
TextView view = holder.textView;
|
||||||
view.setText(playerManager.getItem(position).name);
|
view.setText(playerManager.getItem(position).title);
|
||||||
// TODO: Solve coloring using the theme's ColorStateList.
|
// TODO: Solve coloring using the theme's ColorStateList.
|
||||||
view.setTextColor(ColorUtils.setAlphaComponent(view.getCurrentTextColor(),
|
view.setTextColor(ColorUtils.setAlphaComponent(view.getCurrentTextColor(),
|
||||||
position == playerManager.getCurrentItemIndex() ? 255 : 100));
|
position == playerManager.getCurrentItemIndex() ? 255 : 100));
|
||||||
@ -244,12 +245,19 @@ public class MainActivity extends AppCompatActivity implements OnClickListener,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class SampleListAdapter extends ArrayAdapter<Sample> {
|
private static final class SampleListAdapter extends ArrayAdapter<MediaItem> {
|
||||||
|
|
||||||
public SampleListAdapter(Context context) {
|
public SampleListAdapter(Context context) {
|
||||||
super(context, android.R.layout.simple_list_item_1, DemoUtil.SAMPLES);
|
super(context, android.R.layout.simple_list_item_1, DemoUtil.SAMPLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
|
||||||
|
TextView view = (TextView) super.getView(position, convertView, parent);
|
||||||
|
MediaItem sample = DemoUtil.SAMPLES.get(position);
|
||||||
|
view.setText(sample.title);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,8 @@ import com.google.android.exoplayer2.RenderersFactory;
|
|||||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.Timeline.Period;
|
import com.google.android.exoplayer2.Timeline.Period;
|
||||||
import com.google.android.exoplayer2.castdemo.DemoUtil.Sample;
|
|
||||||
import com.google.android.exoplayer2.ext.cast.CastPlayer;
|
import com.google.android.exoplayer2.ext.cast.CastPlayer;
|
||||||
|
import com.google.android.exoplayer2.ext.cast.MediaItem;
|
||||||
import com.google.android.exoplayer2.ext.cast.RemotePlayer;
|
import com.google.android.exoplayer2.ext.cast.RemotePlayer;
|
||||||
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
|
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
|
||||||
import com.google.android.exoplayer2.source.ExtractorMediaSource;
|
import com.google.android.exoplayer2.source.ExtractorMediaSource;
|
||||||
@ -74,7 +74,7 @@ import java.util.ArrayList;
|
|||||||
private final PlayerControlView castControlView;
|
private final PlayerControlView castControlView;
|
||||||
private final SimpleExoPlayer exoPlayer;
|
private final SimpleExoPlayer exoPlayer;
|
||||||
private final CastPlayer castPlayer;
|
private final CastPlayer castPlayer;
|
||||||
private final ArrayList<DemoUtil.Sample> mediaQueue;
|
private final ArrayList<MediaItem> mediaQueue;
|
||||||
private final QueuePositionListener queuePositionListener;
|
private final QueuePositionListener queuePositionListener;
|
||||||
private final ConcatenatingMediaSource concatenatingMediaSource;
|
private final ConcatenatingMediaSource concatenatingMediaSource;
|
||||||
|
|
||||||
@ -146,15 +146,15 @@ import java.util.ArrayList;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends {@code sample} to the media queue.
|
* Appends {@code item} to the media queue.
|
||||||
*
|
*
|
||||||
* @param sample The {@link Sample} to append.
|
* @param item The {@link MediaItem} to append.
|
||||||
*/
|
*/
|
||||||
public void addItem(Sample sample) {
|
public void addItem(MediaItem item) {
|
||||||
mediaQueue.add(sample);
|
mediaQueue.add(item);
|
||||||
concatenatingMediaSource.addMediaSource(buildMediaSource(sample));
|
concatenatingMediaSource.addMediaSource(buildMediaSource(item));
|
||||||
if (currentPlayer == castPlayer) {
|
if (currentPlayer == castPlayer) {
|
||||||
castPlayer.addItems(buildMediaQueueItem(sample));
|
castPlayer.addItems(buildMediaQueueItem(item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ import java.util.ArrayList;
|
|||||||
* @param position The index of the item.
|
* @param position The index of the item.
|
||||||
* @return The item at the given index in the media queue.
|
* @return The item at the given index in the media queue.
|
||||||
*/
|
*/
|
||||||
public Sample getItem(int position) {
|
public MediaItem getItem(int position) {
|
||||||
return mediaQueue.get(position);
|
return mediaQueue.get(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,9 +388,9 @@ import java.util.ArrayList;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MediaSource buildMediaSource(DemoUtil.Sample sample) {
|
private static MediaSource buildMediaSource(MediaItem item) {
|
||||||
Uri uri = Uri.parse(sample.uri);
|
Uri uri = item.media.uri;
|
||||||
switch (sample.mimeType) {
|
switch (item.mimeType) {
|
||||||
case DemoUtil.MIME_TYPE_SS:
|
case DemoUtil.MIME_TYPE_SS:
|
||||||
return new SsMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
|
return new SsMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
|
||||||
case DemoUtil.MIME_TYPE_DASH:
|
case DemoUtil.MIME_TYPE_DASH:
|
||||||
@ -400,17 +400,20 @@ import java.util.ArrayList;
|
|||||||
case DemoUtil.MIME_TYPE_VIDEO_MP4:
|
case DemoUtil.MIME_TYPE_VIDEO_MP4:
|
||||||
return new ExtractorMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
|
return new ExtractorMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
|
||||||
default: {
|
default: {
|
||||||
throw new IllegalStateException("Unsupported type: " + sample.mimeType);
|
throw new IllegalStateException("Unsupported type: " + item.mimeType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MediaQueueItem buildMediaQueueItem(DemoUtil.Sample sample) {
|
private static MediaQueueItem buildMediaQueueItem(MediaItem item) {
|
||||||
MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
|
MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
|
||||||
movieMetadata.putString(MediaMetadata.KEY_TITLE, sample.name);
|
movieMetadata.putString(MediaMetadata.KEY_TITLE, item.title);
|
||||||
MediaInfo mediaInfo = new MediaInfo.Builder(sample.uri)
|
MediaInfo mediaInfo =
|
||||||
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setContentType(sample.mimeType)
|
new MediaInfo.Builder(item.media.uri.toString())
|
||||||
.setMetadata(movieMetadata).build();
|
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
|
||||||
|
.setContentType(item.mimeType)
|
||||||
|
.setMetadata(movieMetadata)
|
||||||
|
.build();
|
||||||
return new MediaQueueItem.Builder(mediaInfo).build();
|
return new MediaQueueItem.Builder(mediaInfo).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ import java.util.Map;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getUidOfPeriod(int periodIndex) {
|
public Integer getUidOfPeriod(int periodIndex) {
|
||||||
return ids[periodIndex];
|
return ids[periodIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,9 +67,9 @@ public final class MediaItem {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Equivalent to {@link #setMedia(UriBundle) setMedia(new UriBundle(uri))}. */
|
/** Equivalent to {@link #setMedia(UriBundle) setMedia(new UriBundle(Uri.parse(uri)))}. */
|
||||||
public Builder setMedia(String uri) {
|
public Builder setMedia(String uri) {
|
||||||
return setMedia(new UriBundle(uri));
|
return setMedia(new UriBundle(Uri.parse(uri)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See {@link MediaItem#media}. */
|
/** See {@link MediaItem#media}. */
|
||||||
@ -162,7 +162,7 @@ public final class MediaItem {
|
|||||||
public static final class UriBundle {
|
public static final class UriBundle {
|
||||||
|
|
||||||
/** An empty {@link UriBundle}. */
|
/** An empty {@link UriBundle}. */
|
||||||
public static final UriBundle EMPTY = new UriBundle("");
|
public static final UriBundle EMPTY = new UriBundle(Uri.EMPTY);
|
||||||
|
|
||||||
/** A URI. */
|
/** A URI. */
|
||||||
public final Uri uri;
|
public final Uri uri;
|
||||||
@ -171,12 +171,12 @@ public final class MediaItem {
|
|||||||
public final Map<String, String> requestHeaders;
|
public final Map<String, String> requestHeaders;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance from the given string with no request headers.
|
* Creates an instance with no request headers.
|
||||||
*
|
*
|
||||||
* @param uriString See {@link #uri}.
|
* @param uri See {@link #uri}.
|
||||||
*/
|
*/
|
||||||
public UriBundle(String uriString) {
|
public UriBundle(Uri uri) {
|
||||||
this(Uri.parse(uriString), Collections.emptyMap());
|
this(uri, Collections.emptyMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user