Most visited

Recently visited

Added in API level 16

MediaExtractor

public final class MediaExtractor
extends Object

java.lang.Object
   ↳ android.media.MediaExtractor


MediaExtractor便于从数据源中提取解复用的,通常编码的媒体数据。

它通常是这样使用的:

 MediaExtractor extractor = new MediaExtractor();
 extractor.setDataSource(...);
 int numTracks = extractor.getTrackCount();
 for (int i = 0; i < numTracks; ++i) {
   MediaFormat format = extractor.getTrackFormat(i);
   String mime = format.getString(MediaFormat.KEY_MIME);
   if (weAreInterestedInThisTrack) {
     extractor.selectTrack(i);
   }
 }
 ByteBuffer inputBuffer = ByteBuffer.allocate(...)
 while (extractor.readSampleData(inputBuffer, ...) >= 0) {
   int trackIndex = extractor.getSampleTrackIndex();
   long presentationTimeUs = extractor.getSampleTime();
   ...
   extractor.advance();
 }

 extractor.release();
 extractor = null;
 

Summary

Constants

int SAMPLE_FLAG_ENCRYPTED

样本(至少部分)加密,另请参阅 queueSecureInputBuffer(int, int, MediaCodec.CryptoInfo, long, int)的文档

int SAMPLE_FLAG_SYNC

该示例是同步示例(或者以 MediaCodec的术语来说,它是关键帧)。

int SEEK_TO_CLOSEST_SYNC

如果可能的话,寻找最接近指定时间的同步采样

int SEEK_TO_NEXT_SYNC

如果可能,请在指定时间或之后寻找同步采样

int SEEK_TO_PREVIOUS_SYNC

如果可能,请在指定时间或之前寻找同步采样

Public constructors

MediaExtractor()

Public methods

boolean advance()

前进到下一个样本。

long getCachedDuration()

返回目前在内存中缓存的数据量,以微秒为单位表示。

DrmInitData getDrmInitData()

提取DRM初始化数据(如果存在)

Map<UUID, byte[]> getPsshInfo()

如果存在,请获取PSSH信息。

boolean getSampleCryptoInfo(MediaCodec.CryptoInfo info)

如果样本标志指示当前样本至少部分加密,则此调用返回有关解密所需的样本数据结构的相关信息。

int getSampleFlags()

返回当前样本的标志。

long getSampleTime()

以微秒为单位返回当前样本的呈现时间。

int getSampleTrackIndex()

返回当前样本来源的轨道索引(如果没有更多样本可用,则返回-1)

final int getTrackCount()

计算数据源中找到的曲目数量。

MediaFormat getTrackFormat(int index)

获取指定索引处的曲目格式。

boolean hasCacheReachedEndOfStream()

如果我们正在缓存数据并且缓存已到达数据流的末尾(现在,未来的查找当然可能会重新开始提取数据),则返回true。

int readSampleData(ByteBuffer byteBuf, int offset)

检索当前编码样本并将其存储在从给定偏移量开始的字节缓冲区中。

final void release()

确保你在完成任务时释放任何资源,而不是依赖垃圾回收器在将来的某个时刻为你做这件事。

void seekTo(long timeUs, int mode)

根据指定的模式,所有选定的曲目都会在请求的时间附近寻找。

void selectTrack(int index)

随后电话 readSampleData(ByteBuffer, int)getSampleTrackIndex()getSampleTime()只检索曲目的选择的子集的信息。

final void setDataSource(AssetFileDescriptor afd)

设置要使用的数据源(AssetFileDescriptor)。

final void setDataSource(FileDescriptor fd, long offset, long length)

设置要使用的数据源(FileDescriptor)。

final void setDataSource(String path)

设置要使用的数据源(文件路径或http URL)。

final void setDataSource(Context context, Uri uri, Map<StringString> headers)

将数据源设置为内容Uri。

final void setDataSource(FileDescriptor fd)

设置要使用的数据源(FileDescriptor)。

final void setDataSource(String path, Map<StringString> headers)

设置要使用的数据源(文件路径或http URL)。

final void setDataSource(MediaDataSource dataSource)

设置要使用的数据源(MediaDataSource)。

void unselectTrack(int index)

随后电话 readSampleData(ByteBuffer, int)getSampleTrackIndex()getSampleTime()只检索曲目的选择的子集的信息。

Protected methods

void finalize()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。

Inherited methods

From class java.lang.Object

Constants

SAMPLE_FLAG_ENCRYPTED

Added in API level 16
int SAMPLE_FLAG_ENCRYPTED

样本(至少部分)加密,另请参阅 queueSecureInputBuffer(int, int, MediaCodec.CryptoInfo, long, int)的文档

常量值:2(0x00000002)

SAMPLE_FLAG_SYNC

Added in API level 16
int SAMPLE_FLAG_SYNC

该示例是同步示例(或者以 MediaCodec的术语来说,它是关键帧)。

也可以看看:

常数值:1(0x00000001)

SEEK_TO_CLOSEST_SYNC

Added in API level 16
int SEEK_TO_CLOSEST_SYNC

如果可能的话,寻找最接近指定时间的同步采样

常量值:2(0x00000002)

SEEK_TO_NEXT_SYNC

Added in API level 16
int SEEK_TO_NEXT_SYNC

如果可能,请在指定时间或之后寻找同步采样

常数值:1(0x00000001)

SEEK_TO_PREVIOUS_SYNC

Added in API level 16
int SEEK_TO_PREVIOUS_SYNC

如果可能,请在指定时间或之前寻找同步采样

常量值:0(0x00000000)

Public constructors

MediaExtractor

Added in API level 16
MediaExtractor ()

Public methods

advance

Added in API level 16
boolean advance ()

前进到下一个样本。 如果没有更多样本数据可用(流尾),则返回false。

Returns
boolean

getCachedDuration

Added in API level 16
long getCachedDuration ()

返回目前在内存中缓存的数据量,以微秒为单位表示。 如果该信息不可用或不适用(无缓存),则返回-1。

Returns
long

getDrmInitData

Added in API level 24
DrmInitData getDrmInitData ()

提取DRM初始化数据(如果存在)

Returns
DrmInitData DRM initialization data in the content, or null if no recognizable DRM format is found;

也可以看看:

getPsshInfo

Added in API level 18
Map<UUID, byte[]> getPsshInfo ()

如果存在,请获取PSSH信息。

Returns
Map<UUID, byte[]> a map of uuid-to-bytes, with the uuid specifying the crypto scheme, and the bytes being the data specific to that scheme. This can be null if the source does not contain PSSH info.

getSampleCryptoInfo

Added in API level 16
boolean getSampleCryptoInfo (MediaCodec.CryptoInfo info)

如果样本标志指示当前样本至少部分加密,则此调用返回有关解密所需的样本数据结构的相关信息。

Parameters
info MediaCodec.CryptoInfo: The android.media.MediaCodec.CryptoInfo structure to be filled in.
Returns
boolean true iff the sample flags contain SAMPLE_FLAG_ENCRYPTED

getSampleFlags

Added in API level 16
int getSampleFlags ()

返回当前样本的标志。

Returns
int

getSampleTime

Added in API level 16
long getSampleTime ()

以微秒为单位返回当前样本的呈现时间。 如果没有更多样本可用,则为-1。

Returns
long

getSampleTrackIndex

Added in API level 16
int getSampleTrackIndex ()

返回当前样本来源的轨道索引(如果没有更多样本可用,则返回-1)

Returns
int

getTrackCount

Added in API level 16
int getTrackCount ()

计算数据源中找到的曲目数量。

Returns
int

getTrackFormat

Added in API level 16
MediaFormat getTrackFormat (int index)

获取指定索引处的曲目格式。 关于表示的更多细节可以在MediaCodec找到

下表汇总了Android版本中对格式键的支持:

OS Version(s) MediaFormat keys used for
All Tracks Audio Tracks Video Tracks
JELLY_BEAN KEY_MIME,
KEY_DURATION,
KEY_MAX_INPUT_SIZE
KEY_SAMPLE_RATE,
KEY_CHANNEL_COUNT,
KEY_CHANNEL_MASK,
gapless playback information.mp3, .mp4,
KEY_IS_ADTSAAC if streaming,
codec-specific dataAAC, Vorbis
KEY_WIDTH,
KEY_HEIGHT,
codec-specific dataAVC, MPEG4
JELLY_BEAN_MR1
JELLY_BEAN_MR2 as above, plus
Pixel aspect ratio informationAVC, *
KITKAT
KITKAT_WATCH
LOLLIPOP as above, plus
KEY_BIT_RATEAAC,
codec-specific dataOpus
as above, plus
KEY_ROTATION.mp4,
KEY_BIT_RATEMPEG4,
codec-specific dataHEVC
LOLLIPOP_MR1
M as above, plus
gapless playback informationOpus
as above, plus
KEY_FRAME_RATE (integer)
N as above, plus
KEY_TRACK_ID,
KEY_BIT_RATE#, .mp4
as above, plus
KEY_PCM_ENCODING,
KEY_PROFILEAAC
as above, plus
KEY_HDR_STATIC_INFO#, .webm,
KEY_COLOR_STANDARD#,
KEY_COLOR_TRANSFER#,
KEY_COLOR_RANGE#,
KEY_PROFILEMPEG2, H.263, MPEG4, AVC, HEVC, VP9,
KEY_LEVELH.263, MPEG4, AVC, HEVC, VP9,
codec-specific dataVP9

笔记:
#:仅限容器指定的值。
.mp4,.webm ...:列出的容器
MPEG4,AAC ...:列出的编解码器

请注意,容器中包含的级别信息多次与实际比特流的级别不匹配。 在使用曲目格式查找可播放特定曲目的解码器之前,您可能需要使用MediaFormat.setString(KEY_LEVEL, null)清除该级别。

*像素(样本)宽高比在以下键中返回。 显示宽度可以计算为例如:

display-width = display-height * crop-width / crop-height * sar-width / sar-height

Format Key Value Type 描述
"sar-width" Integer Pixel aspect ratio width
"sar-height" Integer Pixel aspect ratio height

Parameters
index int
Returns
MediaFormat

hasCacheReachedEndOfStream

Added in API level 16
boolean hasCacheReachedEndOfStream ()

如果我们正在缓存数据并且缓存已到达数据流的末尾(现在,未来的查找当然可能会重新开始提取数据),则返回true。 如果getCachedDuration()指示存在缓存,则该API仅返回有意义的结果,即不返回-1。

Returns
boolean

readSampleData

Added in API level 16
int readSampleData (ByteBuffer byteBuf, 
                int offset)

检索当前编码样本并将其存储在从给定偏移量开始的字节缓冲区中。

注意:从API 21开始,成功更新 byteBuf的位置和限制以指向刚读取的数据。

Parameters
byteBuf ByteBuffer: the destination byte buffer
offset int
Returns
int the sample size (or -1 if no more samples are available).

release

Added in API level 16
void release ()

确保你在完成任务时释放任何资源,而不是依赖垃圾回收器在将来的某个时刻为你做这件事。

seekTo

Added in API level 16
void seekTo (long timeUs, 
                int mode)

根据指定的模式,所有选定的曲目都会在请求的时间附近寻找。

Parameters
timeUs long
mode int

selectTrack

Added in API level 16
void selectTrack (int index)

随后电话readSampleData(ByteBuffer, int)getSampleTrackIndex()getSampleTime()只检索曲目的选择的子集的信息。 多次选择相同的曲目没有效果,曲目只能选择一次。

Parameters
index int

setDataSource

Added in API level 24
void setDataSource (AssetFileDescriptor afd)

设置要使用的数据源(AssetFileDescriptor)。 调用者有责任关闭文件描述符。 一旦这个通话返回,这样做是安全的。

Parameters
afd AssetFileDescriptor: the AssetFileDescriptor for the file you want to extract from.
Throws
IOException
IllegalArgumentException
IllegalStateException

setDataSource

Added in API level 16
void setDataSource (FileDescriptor fd, 
                long offset, 
                long length)

设置要使用的数据源(FileDescriptor)。 FileDescriptor必须可查找(注意LocalSocket不可查找)。 调用者有责任关闭文件描述符。 一旦这个通话返回,这样做是安全的。

Parameters
fd FileDescriptor: the FileDescriptor for the file you want to extract from.
offset long: the offset into the file where the data to be extracted starts, in bytes
length long: the length in bytes of the data to be extracted
Throws
IOException

setDataSource

Added in API level 16
void setDataSource (String path)

设置要使用的数据源(文件路径或http URL)。

Parameters
path String: the path of the file, or the http URL of the stream

path引用本地文件时,该文件可能实际上由除调用应用程序以外的进程打开。 这意味着路径名应该是绝对路径(因为任何其他进程都在未指定的当前工作目录下运行),并且路径名应该引用世界可读的文件。 作为替代方案,应用程序可以首先打开文件进行读取,然后使用文件描述符表单setDataSource(FileDescriptor)

Throws
IOException

setDataSource

Added in API level 16
void setDataSource (Context context, 
                Uri uri, 
                Map<StringString> headers)

将数据源设置为内容Uri。

Parameters
context Context: the Context to use when resolving the Uri
uri Uri: the Content URI of the data you want to extract from.
headers Map: the headers to be sent together with the request for the data. This can be null if no specific headers are to be sent with the request.
Throws
IOException

setDataSource

Added in API level 16
void setDataSource (FileDescriptor fd)

设置要使用的数据源(FileDescriptor)。 调用者有责任关闭文件描述符。 一旦这个通话返回,这样做是安全的。

Parameters
fd FileDescriptor: the FileDescriptor for the file you want to extract from.
Throws
IOException

setDataSource

Added in API level 16
void setDataSource (String path, 
                Map<StringString> headers)

设置要使用的数据源(文件路径或http URL)。

Parameters
path String: the path of the file, or the http URL
headers Map: the headers associated with the http request for the stream you want to play. This can be null if no specific headers are to be sent with the request.
Throws
IOException

setDataSource

Added in API level 23
void setDataSource (MediaDataSource dataSource)

设置要使用的数据源(MediaDataSource)。

Parameters
dataSource MediaDataSource: the MediaDataSource for the media you want to extract from
Throws
IllegalArgumentException if dataSource is invalid.
IOException

unselectTrack

Added in API level 16
void unselectTrack (int index)

随后电话 readSampleData(ByteBuffer, int)getSampleTrackIndex()getSampleTime()只检索曲目的选择的子集的信息。

Parameters
index int

Protected methods

finalize

Added in API level 16
void finalize ()

当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类重写了finalize方法来处置系统资源或执行其他清理。

的常规协定finalize是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 方法finalize可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。

Objectfinalize方法Object执行特殊操作; 它只是正常返回。 Object子类可能会覆盖此定义。

Java编程语言不能保证哪个线程将为任何给定对象调用finalize方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。

在针对对象调用 finalize方法之后,在Java虚拟机再次确定不再有任何方法可以通过尚未死亡的任何线程访问此对象之前,不会采取进一步的操作,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。

对于任何给定的对象,Java虚拟机永远不会多次调用 finalize方法。

finalize方法引发的任何异常 finalize导致终止此对象的终止,但会被忽略。

Hooray!