MediaExtractorCompat


@UnstableApi
class MediaExtractorCompat


A drop-in replacement for MediaExtractor that provides similar functionality, based on the media3.extractor logic.

Summary

Nested types

@IntDef(value = )
@Retention(value = RetentionPolicy.SOURCE)
annotation MediaExtractorCompat.SeekMode

The seeking mode.

Public constructors

Creates a new instance.

MediaExtractorCompat(
    extractorsFactory: ExtractorsFactory!,
    dataSourceFactory: DataSource.Factory!
)

Creates a new instance using the given ExtractorsFactory to create the extractors to use for obtaining media samples from a DataSource generated by the given DataSource.Factory.

Public functions

Boolean

Advances to the next sample.

Long

Returns an estimate of how much data is presently cached in memory, expressed in microseconds, or -1 if this information is unavailable or not applicable (i.e., no cache exists).

DrmInitData?

Extracts the DRM initialization data from the available tracks, if it exists.

PersistableBundle!
@RequiresApi(value = 26)
getMetrics()

Returns a PersistableBundle containing metrics data for the current media container.

(Mutable)Map<UUID!, ByteArray<Byte>!>?

Extracts PSSH data from the media, if present.

Boolean

Returns true if the current sample is at least partially encrypted and fills the provided MediaCodec.CryptoInfo structure with relevant decryption information.

Int

Returns the current sample's flags.

Long

Returns the current sample's size in bytes, or -1 if no more samples are available.

Long

Returns the current sample's presentation time in microseconds, or -1 if no more samples are available.

Int

Returns the track index the current sample originates from, or -1 if no more samples are available.

Int

Returns the number of tracks found in the data source.

MediaFormat!
getTrackFormat(trackIndex: Int)

Returns the track MediaFormat at the specified trackIndex.

Boolean

Returns true if data is being cached and the cache has reached the end of the data stream.

Int
readSampleData(buffer: ByteBuffer!, offset: Int)

Retrieves the current encoded sample and stores it in the byte buffer starting at the given offset.

Unit

Releases any resources held by this instance.

Unit

All selected tracks seek near the requested timeUs according to the specified mode.

Unit
selectTrack(trackIndex: Int)

Selects a track at the specified trackIndex.

Unit
setDataSource(assetFileDescriptor: AssetFileDescriptor!)

Sets the data source using the media stream obtained from the provided .

Unit
setDataSource(fileDescriptor: FileDescriptor!)

Sets the data source using the media stream obtained from the provided FileDescriptor.

Unit
@RequiresApi(value = 23)
setDataSource(mediaDataSource: MediaDataSource!)

Sets the data source using the media stream obtained from the given MediaDataSource.

Unit

Sets the data source using the media stream obtained from the given file path or HTTP URL.

Unit
setDataSource(path: String!, headers: (Mutable)Map<String!, String!>?)

Sets the data source using the media stream obtained from the given file path or HTTP URL, with optional HTTP request headers.

Unit
setDataSource(uri: Uri!, offset: Long)

Sets the data source using the media stream obtained from the given Uri at the given offset.

Unit
setDataSource(
    context: Context!,
    uri: Uri!,
    headers: (Mutable)Map<String!, String!>?
)

Sets the data source using the media stream obtained from the given content URI and optional HTTP request headers.

Unit
setDataSource(fileDescriptor: FileDescriptor!, offset: Long, length: Long)

Sets the data source using the media stream obtained from the provided FileDescriptor, with a specified offset and length.

Unit
unselectTrack(trackIndex: Int)

Unselects the track at the specified trackIndex.

Constants

SEEK_TO_CLOSEST_SYNC

const val SEEK_TO_CLOSEST_SYNC = 2: Int

See SEEK_TO_CLOSEST_SYNC.

SEEK_TO_NEXT_SYNC

const val SEEK_TO_NEXT_SYNC = 1: Int

See SEEK_TO_NEXT_SYNC.

SEEK_TO_PREVIOUS_SYNC

const val SEEK_TO_PREVIOUS_SYNC = 0: Int

See SEEK_TO_PREVIOUS_SYNC.

Public constructors

MediaExtractorCompat

MediaExtractorCompat(context: Context!)

Creates a new instance.

MediaExtractorCompat

MediaExtractorCompat(
    extractorsFactory: ExtractorsFactory!,
    dataSourceFactory: DataSource.Factory!
)

Creates a new instance using the given ExtractorsFactory to create the extractors to use for obtaining media samples from a DataSource generated by the given DataSource.Factory.

Note: The DataSource.Factory provided will not be used to generate when setting data source using methods:

Note: The DataSource.Factory provided may not be used to generate DataSource when setting data source using method setDataSource as the behavior depends on the fallthrough logic related to the scheme of the provided URI.

Public functions

advance

fun advance(): Boolean

Advances to the next sample. Returns false if no more sample data is available (i.e., end of stream), or true otherwise.

Note: When extracting from a local file, the behavior of advance and readSampleData is undefined if there are concurrent writes to the same file. This may result in an unexpected end of stream being signaled.

getCachedDuration

fun getCachedDuration(): Long

Returns an estimate of how much data is presently cached in memory, expressed in microseconds, or -1 if this information is unavailable or not applicable (i.e., no cache exists).

getDrmInitData

fun getDrmInitData(): DrmInitData?

Extracts the DRM initialization data from the available tracks, if it exists.

Returns
DrmInitData?

The DrmInitData in the content, or null if no recognizable DRM format is found.

getMetrics

@RequiresApi(value = 26)
fun getMetrics(): PersistableBundle!

Returns a PersistableBundle containing metrics data for the current media container.

The bundle includes attributes and values for the media container, as described in .

getPsshInfo

fun getPsshInfo(): (Mutable)Map<UUID!, ByteArray<Byte>!>?

Extracts PSSH data from the media, if present.

Returns
(Mutable)Map<UUID!, ByteArray<Byte>!>?

A Map of UUID-to-byte[] pairs, where the UUID identifies the crypto scheme, and the byte array contains the scheme-specific data. Returns null if no PSSH data exists.

getSampleCryptoInfo

fun getSampleCryptoInfo(info: MediaCodec.CryptoInfo!): Boolean

Returns true if the current sample is at least partially encrypted and fills the provided MediaCodec.CryptoInfo structure with relevant decryption information.

Parameters
info: MediaCodec.CryptoInfo!

The MediaCodec.CryptoInfo structure to be filled with decryption data.

Returns
Boolean

true if the sample is at least partially encrypted, false otherwise.

getSampleFlags

fun getSampleFlags(): Int

Returns the current sample's flags.

getSampleSize

fun getSampleSize(): Long

Returns the current sample's size in bytes, or -1 if no more samples are available.

getSampleTime

fun getSampleTime(): Long

Returns the current sample's presentation time in microseconds, or -1 if no more samples are available.

getSampleTrackIndex

fun getSampleTrackIndex(): Int

Returns the track index the current sample originates from, or -1 if no more samples are available.

getTrackCount

fun getTrackCount(): Int

Returns the number of tracks found in the data source.

getTrackFormat

fun getTrackFormat(trackIndex: Int): MediaFormat!

Returns the track MediaFormat at the specified trackIndex.

hasCacheReachedEndOfStream

fun hasCacheReachedEndOfStream(): Boolean

Returns true if data is being cached and the cache has reached the end of the data stream. This indicates that no additional data is currently available for caching, although a future seek may restart data fetching. This method only returns a meaningful result if getCachedDuration indicates the presence of a cache (i.e., does not return -1).

readSampleData

fun readSampleData(buffer: ByteBuffer!, offset: Int): Int

Retrieves the current encoded sample and stores it in the byte buffer starting at the given offset.

Note:On success, the position and limit of buffer is updated to point to the data just read.

Parameters
buffer: ByteBuffer!

the destination byte buffer.

offset: Int

The offset into the byte buffer at which to write.

Returns
Int

the sample size, or -1 if no more samples are available.

release

fun release(): Unit

Releases any resources held by this instance.

Note: Make sure you call this when you're done to free up any resources instead of relying on the garbage collector to do this for you at some point in the future.

seekTo

fun seekTo(timeUs: Long, @MediaExtractorCompat.SeekMode mode: Int): Unit

All selected tracks seek near the requested timeUs according to the specified mode.

selectTrack

fun selectTrack(trackIndex: Int): Unit

Selects a track at the specified trackIndex.

Subsequent calls to readSampleData, getSampleTrackIndex and getSampleTime only retrieve information for the subset of tracks selected.

Note: Selecting the same track multiple times has no effect, the track is only selected once.

setDataSource

fun setDataSource(assetFileDescriptor: AssetFileDescriptor!): Unit

Sets the data source using the media stream obtained from the provided .

Note: The caller is responsible for closing the AssetFileDescriptor. It is safe to do so immediately after this method returns.

Parameters
assetFileDescriptor: AssetFileDescriptor!

The AssetFileDescriptor for the file to extract from.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(fileDescriptor: FileDescriptor!): Unit

Sets the data source using the media stream obtained from the provided FileDescriptor.

Parameters
fileDescriptor: FileDescriptor!

The FileDescriptor for the file to extract from.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

@RequiresApi(value = 23)
fun setDataSource(mediaDataSource: MediaDataSource!): Unit

Sets the data source using the media stream obtained from the given MediaDataSource.

Parameters
mediaDataSource: MediaDataSource!

The MediaDataSource to extract media from.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(path: String!): Unit

Sets the data source using the media stream obtained from the given file path or HTTP URL.

Parameters
path: String!

The path of the file, or the HTTP URL, to extract media from.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(path: String!, headers: (Mutable)Map<String!, String!>?): Unit

Sets the data source using the media stream obtained from the given file path or HTTP URL, with optional HTTP request headers.

Parameters
path: String!

The path of the file, or the HTTP URL, to extract media from.

headers: (Mutable)Map<String!, String!>?

An optional Map of HTTP request headers to include when fetching the data, or null if no headers are to be included.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(uri: Uri!, offset: Long): Unit

Sets the data source using the media stream obtained from the given Uri at the given offset.

Parameters
uri: Uri!

The content Uri to extract from.

offset: Long

The offset into the file where the data to be extracted starts, in bytes.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(
    context: Context!,
    uri: Uri!,
    headers: (Mutable)Map<String!, String!>?
): Unit

Sets the data source using the media stream obtained from the given content URI and optional HTTP request headers.

Parameters
context: Context!

The Context used to resolve the Uri.

uri: Uri!

The content URI of the media to extract from.

headers: (Mutable)Map<String!, String!>?

An optional Map of HTTP request headers to include when fetching the data, or null if no headers are to be included.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

setDataSource

fun setDataSource(fileDescriptor: FileDescriptor!, offset: Long, length: Long): Unit

Sets the data source using the media stream obtained from the provided FileDescriptor, with a specified offset and length.

Parameters
fileDescriptor: FileDescriptor!

The FileDescriptor for the file to extract from.

offset: Long

The offset into the file where the data to be extracted starts, in bytes.

length: Long

The length of the data to be extracted, in bytes, or LENGTH_UNSET if it is unknown.

Throws
java.io.IOException

If an error occurs while extracting the media.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException

If none of the available extractors successfully sniffs the input.

java.lang.IllegalStateException

If this method is called twice on the same instance.

unselectTrack

fun unselectTrack(trackIndex: Int): Unit

Unselects the track at the specified trackIndex.

Subsequent calls to readSampleData, getSampleTrackIndex and getSampleTime only retrieve information for the subset of tracks selected.

Public properties

allocator

val allocatorAllocator!

logSessionId

var logSessionIdLogSessionId?