Class ConcatenatingMediaSource
- java.lang.Object
-
- com.google.android.exoplayer2.source.BaseMediaSource
-
- com.google.android.exoplayer2.source.CompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
-
- com.google.android.exoplayer2.source.ConcatenatingMediaSource
-
- All Implemented Interfaces:
MediaSource
public final class ConcatenatingMediaSource extends CompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
Concatenates multipleMediaSource
s. The list ofMediaSource
s can be modified during playback. It is valid for the sameMediaSource
instance to be present more than once in the concatenation. Access to this class is thread-safe.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface com.google.android.exoplayer2.source.MediaSource
MediaSource.MediaPeriodId, MediaSource.MediaSourceCaller
-
-
Constructor Summary
Constructors Constructor Description ConcatenatingMediaSource(boolean isAtomic, boolean useLazyPreparation, ShuffleOrder shuffleOrder, MediaSource... mediaSources)
ConcatenatingMediaSource(boolean isAtomic, MediaSource... mediaSources)
ConcatenatingMediaSource(boolean isAtomic, ShuffleOrder shuffleOrder, MediaSource... mediaSources)
ConcatenatingMediaSource(MediaSource... mediaSources)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addMediaSource(int index, MediaSource mediaSource)
Adds aMediaSource
to the playlist.void
addMediaSource(int index, MediaSource mediaSource, Handler handler, Runnable onCompletionAction)
Adds aMediaSource
to the playlist and executes a custom action on completion.void
addMediaSource(MediaSource mediaSource)
Appends aMediaSource
to the playlist.void
addMediaSource(MediaSource mediaSource, Handler handler, Runnable onCompletionAction)
Appends aMediaSource
to the playlist and executes a custom action on completion.void
addMediaSources(int index, Collection<MediaSource> mediaSources)
Adds multipleMediaSource
s to the playlist.void
addMediaSources(int index, Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction)
Adds multipleMediaSource
s to the playlist and executes a custom action on completion.void
addMediaSources(Collection<MediaSource> mediaSources)
Appends multipleMediaSource
s to the playlist.void
addMediaSources(Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction)
Appends multipleMediaSource
s to the playlist and executes a custom action on completion.void
clear()
Clears the playlist.void
clear(Handler handler, Runnable onCompletionAction)
Clears the playlist and executes a custom action on completion.MediaPeriod
createPeriod(MediaSource.MediaPeriodId id, Allocator allocator, long startPositionUs)
Returns a newMediaPeriod
identified byperiodId
.protected void
disableInternal()
Disables the source, seeBaseMediaSource.disable(MediaSourceCaller)
.protected void
enableInternal()
Enables the source, seeBaseMediaSource.enable(MediaSourceCaller)
.Timeline
getInitialTimeline()
Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.MediaItem
getMediaItem()
Returns theMediaItem
whose media is provided by the source.protected MediaSource.MediaPeriodId
getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, MediaSource.MediaPeriodId mediaPeriodId)
Returns theMediaSource.MediaPeriodId
in the composite source corresponding to the specifiedMediaSource.MediaPeriodId
in a child source.MediaSource
getMediaSource(int index)
Returns theMediaSource
at a specified index.int
getSize()
Returns the number of media sources in the playlist.protected int
getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, int windowIndex)
Returns the window index in the composite source corresponding to the specified window index in a child source.boolean
isSingleWindow()
Returns true if the media source is guaranteed to never have zero or more than one window.void
moveMediaSource(int currentIndex, int newIndex)
Moves an existingMediaSource
within the playlist.void
moveMediaSource(int currentIndex, int newIndex, Handler handler, Runnable onCompletionAction)
Moves an existingMediaSource
within the playlist and executes a custom action on completion.protected void
onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, MediaSource mediaSource, Timeline timeline)
Called when the source info of a child source has been refreshed.protected void
prepareSourceInternal(TransferListener mediaTransferListener)
Starts source preparation and enables the source, seeBaseMediaSource.prepareSource(MediaSourceCaller, TransferListener)
.void
releasePeriod(MediaPeriod mediaPeriod)
Releases the period.protected void
releaseSourceInternal()
Releases the source, seeBaseMediaSource.releaseSource(MediaSourceCaller)
.MediaSource
removeMediaSource(int index)
Removes aMediaSource
from the playlist.MediaSource
removeMediaSource(int index, Handler handler, Runnable onCompletionAction)
Removes aMediaSource
from the playlist and executes a custom action on completion.void
removeMediaSourceRange(int fromIndex, int toIndex)
Removes a range ofMediaSource
s from the playlist, by specifying an initial index (included) and a final index (excluded).void
removeMediaSourceRange(int fromIndex, int toIndex, Handler handler, Runnable onCompletionAction)
Removes a range ofMediaSource
s from the playlist, by specifying an initial index (included) and a final index (excluded), and executes a custom action on completion.void
setShuffleOrder(ShuffleOrder shuffleOrder)
Sets a new shuffle order to use when shuffling the child media sources.void
setShuffleOrder(ShuffleOrder shuffleOrder, Handler handler, Runnable onCompletionAction)
Sets a new shuffle order to use when shuffling the child media sources.-
Methods inherited from class com.google.android.exoplayer2.source.CompositeMediaSource
disableChildSource, enableChildSource, getMediaTimeForChildMediaTime, maybeThrowSourceInfoRefreshError, prepareChildSource, releaseChildSource
-
Methods inherited from class com.google.android.exoplayer2.source.BaseMediaSource
addDrmEventListener, addEventListener, createDrmEventDispatcher, createDrmEventDispatcher, createEventDispatcher, createEventDispatcher, createEventDispatcher, disable, enable, isEnabled, prepareSource, refreshSourceInfo, releaseSource, removeDrmEventListener, removeEventListener
-
-
-
-
Constructor Detail
-
ConcatenatingMediaSource
public ConcatenatingMediaSource(MediaSource... mediaSources)
- Parameters:
mediaSources
- TheMediaSource
s to concatenate. It is valid for the sameMediaSource
instance to be present more than once in the array.
-
ConcatenatingMediaSource
public ConcatenatingMediaSource(boolean isAtomic, MediaSource... mediaSources)
- Parameters:
isAtomic
- Whether the concatenating media source will be treated as atomic, i.e., treated as a single item for repeating and shuffling.mediaSources
- TheMediaSource
s to concatenate. It is valid for the sameMediaSource
instance to be present more than once in the array.
-
ConcatenatingMediaSource
public ConcatenatingMediaSource(boolean isAtomic, ShuffleOrder shuffleOrder, MediaSource... mediaSources)
- Parameters:
isAtomic
- Whether the concatenating media source will be treated as atomic, i.e., treated as a single item for repeating and shuffling.shuffleOrder
- TheShuffleOrder
to use when shuffling the child media sources.mediaSources
- TheMediaSource
s to concatenate. It is valid for the sameMediaSource
instance to be present more than once in the array.
-
ConcatenatingMediaSource
public ConcatenatingMediaSource(boolean isAtomic, boolean useLazyPreparation, ShuffleOrder shuffleOrder, MediaSource... mediaSources)
- Parameters:
isAtomic
- Whether the concatenating media source will be treated as atomic, i.e., treated as a single item for repeating and shuffling.useLazyPreparation
- Whether playlist items are prepared lazily. If false, all manifest loads and other initial preparation steps happen immediately. If true, these initial preparations are triggered only when the player starts buffering the media.shuffleOrder
- TheShuffleOrder
to use when shuffling the child media sources.mediaSources
- TheMediaSource
s to concatenate. It is valid for the sameMediaSource
instance to be present more than once in the array.
-
-
Method Detail
-
getInitialTimeline
public Timeline getInitialTimeline()
Description copied from interface:MediaSource
Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.The initial timeline must use the same uids for windows and periods that the real timeline will use. It also must provide windows which are marked as dynamic to indicate that the window is expected to change when the real timeline arrives.
Any media source which has multiple windows should typically provide such an initial timeline to make sure the player reports the correct number of windows immediately.
-
isSingleWindow
public boolean isSingleWindow()
Description copied from interface:MediaSource
Returns true if the media source is guaranteed to never have zero or more than one window.The default implementation returns
true
.- Returns:
- true if the source has exactly one window.
-
addMediaSource
public void addMediaSource(MediaSource mediaSource)
Appends aMediaSource
to the playlist.- Parameters:
mediaSource
- TheMediaSource
to be added to the list.
-
addMediaSource
public void addMediaSource(MediaSource mediaSource, Handler handler, Runnable onCompletionAction)
Appends aMediaSource
to the playlist and executes a custom action on completion.- Parameters:
mediaSource
- TheMediaSource
to be added to the list.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media source has been added to the playlist.
-
addMediaSource
public void addMediaSource(int index, MediaSource mediaSource)
Adds aMediaSource
to the playlist.- Parameters:
index
- The index at which the newMediaSource
will be inserted. This index must be in the range of 0 <= index <=getSize()
.mediaSource
- TheMediaSource
to be added to the list.
-
addMediaSource
public void addMediaSource(int index, MediaSource mediaSource, Handler handler, Runnable onCompletionAction)
Adds aMediaSource
to the playlist and executes a custom action on completion.- Parameters:
index
- The index at which the newMediaSource
will be inserted. This index must be in the range of 0 <= index <=getSize()
.mediaSource
- TheMediaSource
to be added to the list.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media source has been added to the playlist.
-
addMediaSources
public void addMediaSources(Collection<MediaSource> mediaSources)
Appends multipleMediaSource
s to the playlist.- Parameters:
mediaSources
- A collection ofMediaSource
s to be added to the list. The media sources are added in the order in which they appear in this collection.
-
addMediaSources
public void addMediaSources(Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction)
Appends multipleMediaSource
s to the playlist and executes a custom action on completion.- Parameters:
mediaSources
- A collection ofMediaSource
s to be added to the list. The media sources are added in the order in which they appear in this collection.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media sources have been added to the playlist.
-
addMediaSources
public void addMediaSources(int index, Collection<MediaSource> mediaSources)
Adds multipleMediaSource
s to the playlist.- Parameters:
index
- The index at which the newMediaSource
s will be inserted. This index must be in the range of 0 <= index <=getSize()
.mediaSources
- A collection ofMediaSource
s to be added to the list. The media sources are added in the order in which they appear in this collection.
-
addMediaSources
public void addMediaSources(int index, Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction)
Adds multipleMediaSource
s to the playlist and executes a custom action on completion.- Parameters:
index
- The index at which the newMediaSource
s will be inserted. This index must be in the range of 0 <= index <=getSize()
.mediaSources
- A collection ofMediaSource
s to be added to the list. The media sources are added in the order in which they appear in this collection.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media sources have been added to the playlist.
-
removeMediaSource
public MediaSource removeMediaSource(int index)
Removes aMediaSource
from the playlist.Note: If you want to move the instance, it's preferable to use
moveMediaSource(int, int)
instead.Note: If you want to remove a set of contiguous sources, it's preferable to use
removeMediaSourceRange(int, int)
instead.- Parameters:
index
- The index at which the media source will be removed. This index must be in the range of 0 <= index <getSize()
.- Returns:
- The removed
MediaSource
.
-
removeMediaSource
public MediaSource removeMediaSource(int index, Handler handler, Runnable onCompletionAction)
Removes aMediaSource
from the playlist and executes a custom action on completion.Note: If you want to move the instance, it's preferable to use
moveMediaSource(int, int, Handler, Runnable)
instead.Note: If you want to remove a set of contiguous sources, it's preferable to use
removeMediaSourceRange(int, int, Handler, Runnable)
instead.- Parameters:
index
- The index at which the media source will be removed. This index must be in the range of 0 <= index <getSize()
.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media source has been removed from the playlist.- Returns:
- The removed
MediaSource
.
-
removeMediaSourceRange
public void removeMediaSourceRange(int fromIndex, int toIndex)
Removes a range ofMediaSource
s from the playlist, by specifying an initial index (included) and a final index (excluded).Note: when specified range is empty, no actual media source is removed and no exception is thrown.
- Parameters:
fromIndex
- The initial range index, pointing to the first media source that will be removed. This index must be in the range of 0 <= index <=getSize()
.toIndex
- The final range index, pointing to the first media source that will be left untouched. This index must be in the range of 0 <= index <=getSize()
.- Throws:
IndexOutOfBoundsException
- When the range is malformed, i.e.fromIndex
< 0,toIndex
>getSize()
,fromIndex
>toIndex
-
removeMediaSourceRange
public void removeMediaSourceRange(int fromIndex, int toIndex, Handler handler, Runnable onCompletionAction)
Removes a range ofMediaSource
s from the playlist, by specifying an initial index (included) and a final index (excluded), and executes a custom action on completion.Note: when specified range is empty, no actual media source is removed and no exception is thrown.
- Parameters:
fromIndex
- The initial range index, pointing to the first media source that will be removed. This index must be in the range of 0 <= index <=getSize()
.toIndex
- The final range index, pointing to the first media source that will be left untouched. This index must be in the range of 0 <= index <=getSize()
.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media source range has been removed from the playlist.- Throws:
IllegalArgumentException
- When the range is malformed, i.e.fromIndex
< 0,toIndex
>getSize()
,fromIndex
>toIndex
-
moveMediaSource
public void moveMediaSource(int currentIndex, int newIndex)
Moves an existingMediaSource
within the playlist.
-
moveMediaSource
public void moveMediaSource(int currentIndex, int newIndex, Handler handler, Runnable onCompletionAction)
Moves an existingMediaSource
within the playlist and executes a custom action on completion.- Parameters:
currentIndex
- The current index of the media source in the playlist. This index must be in the range of 0 <= index <getSize()
.newIndex
- The target index of the media source in the playlist. This index must be in the range of 0 <= index <getSize()
.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the media source has been moved.
-
clear
public void clear()
Clears the playlist.
-
clear
public void clear(Handler handler, Runnable onCompletionAction)
Clears the playlist and executes a custom action on completion.
-
getSize
public int getSize()
Returns the number of media sources in the playlist.
-
getMediaSource
public MediaSource getMediaSource(int index)
Returns theMediaSource
at a specified index.- Parameters:
index
- An index in the range of 0 <= index <=getSize()
.- Returns:
- The
MediaSource
at this index.
-
setShuffleOrder
public void setShuffleOrder(ShuffleOrder shuffleOrder)
Sets a new shuffle order to use when shuffling the child media sources.- Parameters:
shuffleOrder
- AShuffleOrder
.
-
setShuffleOrder
public void setShuffleOrder(ShuffleOrder shuffleOrder, Handler handler, Runnable onCompletionAction)
Sets a new shuffle order to use when shuffling the child media sources.- Parameters:
shuffleOrder
- AShuffleOrder
.handler
- TheHandler
to runonCompletionAction
.onCompletionAction
- ARunnable
which is executed immediately after the shuffle order has been changed.
-
getMediaItem
public MediaItem getMediaItem()
Description copied from interface:MediaSource
Returns theMediaItem
whose media is provided by the source.
-
prepareSourceInternal
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener)
Description copied from class:BaseMediaSource
Starts source preparation and enables the source, seeBaseMediaSource.prepareSource(MediaSourceCaller, TransferListener)
. This method is called at most once until the next call toBaseMediaSource.releaseSourceInternal()
.- Overrides:
prepareSourceInternal
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
- Parameters:
mediaTransferListener
- The transfer listener which should be informed of any media data transfers. May be null if no listener is available. Note that this listener should usually be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data.
-
enableInternal
protected void enableInternal()
Description copied from class:BaseMediaSource
Enables the source, seeBaseMediaSource.enable(MediaSourceCaller)
.- Overrides:
enableInternal
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
-
createPeriod
public MediaPeriod createPeriod(MediaSource.MediaPeriodId id, Allocator allocator, long startPositionUs)
Description copied from interface:MediaSource
Returns a newMediaPeriod
identified byperiodId
.Should not be called directly from application code.
Must only be called if the source is enabled.
- Parameters:
id
- The identifier of the period.allocator
- AnAllocator
from which to obtain media buffer allocations.startPositionUs
- The expected start position, in microseconds.- Returns:
- A new
MediaPeriod
.
-
releasePeriod
public void releasePeriod(MediaPeriod mediaPeriod)
Description copied from interface:MediaSource
Releases the period.Should not be called directly from application code.
- Parameters:
mediaPeriod
- The period to release.
-
disableInternal
protected void disableInternal()
Description copied from class:BaseMediaSource
Disables the source, seeBaseMediaSource.disable(MediaSourceCaller)
.- Overrides:
disableInternal
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
-
releaseSourceInternal
protected void releaseSourceInternal()
Description copied from class:BaseMediaSource
Releases the source, seeBaseMediaSource.releaseSource(MediaSourceCaller)
. This method is called exactly once after each call toBaseMediaSource.prepareSourceInternal(TransferListener)
.- Overrides:
releaseSourceInternal
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
-
onChildSourceInfoRefreshed
protected void onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, MediaSource mediaSource, Timeline timeline)
Description copied from class:CompositeMediaSource
Called when the source info of a child source has been refreshed.- Specified by:
onChildSourceInfoRefreshed
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
- Parameters:
mediaSourceHolder
- The unique id used to prepare the child source.mediaSource
- The child source whose source info has been refreshed.timeline
- The timeline of the child source.
-
getMediaPeriodIdForChildMediaPeriodId
@Nullable protected MediaSource.MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, MediaSource.MediaPeriodId mediaPeriodId)
Description copied from class:CompositeMediaSource
Returns theMediaSource.MediaPeriodId
in the composite source corresponding to the specifiedMediaSource.MediaPeriodId
in a child source. The default implementation does not change the media period id.- Overrides:
getMediaPeriodIdForChildMediaPeriodId
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
- Parameters:
mediaSourceHolder
- The unique id used to prepare the child source.mediaPeriodId
- AMediaSource.MediaPeriodId
of the child source.- Returns:
- The corresponding
MediaSource.MediaPeriodId
in the composite source. Null if no corresponding media period id can be determined.
-
getWindowIndexForChildWindowIndex
protected int getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder mediaSourceHolder, int windowIndex)
Description copied from class:CompositeMediaSource
Returns the window index in the composite source corresponding to the specified window index in a child source. The default implementation does not change the window index.- Overrides:
getWindowIndexForChildWindowIndex
in classCompositeMediaSource<com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder>
- Parameters:
mediaSourceHolder
- The unique id used to prepare the child source.windowIndex
- A window index of the child source.- Returns:
- The corresponding window index in the composite source.
-
-