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;
Constants |
|
---|---|
int |
SAMPLE_FLAG_ENCRYPTED 样本(至少部分)加密,另请参阅 |
int |
SAMPLE_FLAG_SYNC 该示例是同步示例(或者以 |
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) 随后电话 |
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<String, String> headers) 将数据源设置为内容Uri。 |
final void |
setDataSource(FileDescriptor fd) 设置要使用的数据源(FileDescriptor)。 |
final void |
setDataSource(String path, Map<String, String> headers) 设置要使用的数据源(文件路径或http URL)。 |
final void |
setDataSource(MediaDataSource dataSource) 设置要使用的数据源(MediaDataSource)。 |
void |
unselectTrack(int index) 随后电话 |
Protected methods |
|
---|---|
void |
finalize() 当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int SAMPLE_FLAG_ENCRYPTED
样本(至少部分)加密,另请参阅 queueSecureInputBuffer(int, int, MediaCodec.CryptoInfo, long, int)
的文档
常量值:2(0x00000002)
int SAMPLE_FLAG_SYNC
该示例是同步示例(或者以 MediaCodec
的术语来说,它是关键帧)。
也可以看看:
常数值:1(0x00000001)
int SEEK_TO_CLOSEST_SYNC
如果可能的话,寻找最接近指定时间的同步采样
常量值:2(0x00000002)
int SEEK_TO_NEXT_SYNC
如果可能,请在指定时间或之后寻找同步采样
常数值:1(0x00000001)
int SEEK_TO_PREVIOUS_SYNC
如果可能,请在指定时间或之前寻找同步采样
常量值:0(0x00000000)
boolean advance ()
前进到下一个样本。 如果没有更多样本数据可用(流尾),则返回false。
Returns | |
---|---|
boolean |
long getCachedDuration ()
返回目前在内存中缓存的数据量,以微秒为单位表示。 如果该信息不可用或不适用(无缓存),则返回-1。
Returns | |
---|---|
long |
DrmInitData getDrmInitData ()
提取DRM初始化数据(如果存在)
Returns | |
---|---|
DrmInitData |
DRM initialization data in the content, or null if no recognizable DRM format is found; |
也可以看看:
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. |
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 |
long getSampleTime ()
以微秒为单位返回当前样本的呈现时间。 如果没有更多样本可用,则为-1。
Returns | |
---|---|
long |
int getSampleTrackIndex ()
返回当前样本来源的轨道索引(如果没有更多样本可用,则返回-1)
Returns | |
---|---|
int |
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_ADTS AAC 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, plusKEY_BIT_RATE AAC,codec-specific dataOpus |
as above, plusKEY_ROTATION .mp4,KEY_BIT_RATE MPEG4,codec-specific dataHEVC |
|
LOLLIPOP_MR1 |
|||
M |
as above, plus gapless playback informationOpus |
as above, plusKEY_FRAME_RATE (integer) |
|
N |
as above, plusKEY_TRACK_ID ,KEY_BIT_RATE #, .mp4 |
as above, plusKEY_PCM_ENCODING ,KEY_PROFILE AAC |
as above, plusKEY_HDR_STATIC_INFO #, .webm,KEY_COLOR_STANDARD #,KEY_COLOR_TRANSFER #,KEY_COLOR_RANGE #,KEY_PROFILE MPEG2, H.263, MPEG4, AVC, HEVC, VP9,KEY_LEVEL H.263, MPEG4, AVC, HEVC, VP9,codec-specific dataVP9 |
笔记: |
|||
请注意,容器中包含的级别信息多次与实际比特流的级别不匹配。 在使用曲目格式查找可播放特定曲目的解码器之前,您可能需要使用 |
|||
*像素(样本)宽高比在以下键中返回。 显示宽度可以计算为例如: 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 |
boolean hasCacheReachedEndOfStream ()
如果我们正在缓存数据并且缓存已到达数据流的末尾(现在,未来的查找当然可能会重新开始提取数据),则返回true。 如果getCachedDuration()
指示存在缓存,则该API仅返回有意义的结果,即不返回-1。
Returns | |
---|---|
boolean |
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). |
void seekTo (long timeUs, int mode)
根据指定的模式,所有选定的曲目都会在请求的时间附近寻找。
Parameters | |
---|---|
timeUs |
long
|
mode |
int
|
void selectTrack (int index)
随后电话readSampleData(ByteBuffer, int)
, getSampleTrackIndex()
和getSampleTime()
只检索曲目的选择的子集的信息。 多次选择相同的曲目没有效果,曲目只能选择一次。
Parameters | |
---|---|
index |
int
|
void setDataSource (AssetFileDescriptor afd)
设置要使用的数据源(AssetFileDescriptor)。 调用者有责任关闭文件描述符。 一旦这个通话返回,这样做是安全的。
Parameters | |
---|---|
afd |
AssetFileDescriptor : the AssetFileDescriptor for the file you want to extract from. |
Throws | |
---|---|
IOException |
|
IllegalArgumentException |
|
IllegalStateException |
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 |
void setDataSource (String path)
设置要使用的数据源(文件路径或http URL)。
Parameters | |
---|---|
path |
String : the path of the file, or the http URL of the stream 当 |
Throws | |
---|---|
IOException |
void setDataSource (Context context, Uri uri, Map<String, String> 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 |
void setDataSource (FileDescriptor fd)
设置要使用的数据源(FileDescriptor)。 调用者有责任关闭文件描述符。 一旦这个通话返回,这样做是安全的。
Parameters | |
---|---|
fd |
FileDescriptor : the FileDescriptor for the file you want to extract from. |
Throws | |
---|---|
IOException |
void setDataSource (String path, Map<String, String> 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 |
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 |
void unselectTrack (int index)
随后电话 readSampleData(ByteBuffer, int)
, getSampleTrackIndex()
和 getSampleTime()
只检索曲目的选择的子集的信息。
Parameters | |
---|---|
index |
int
|
void finalize ()
当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类重写了finalize
方法来处置系统资源或执行其他清理。
的常规协定finalize
是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 方法finalize
可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize
的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。
类Object
的finalize
方法Object
执行特殊操作; 它只是正常返回。 Object
子类可能会覆盖此定义。
Java编程语言不能保证哪个线程将为任何给定对象调用finalize
方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。
在针对对象调用 finalize
方法之后,在Java虚拟机再次确定不再有任何方法可以通过尚未死亡的任何线程访问此对象之前,不会采取进一步的操作,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。
对于任何给定的对象,Java虚拟机永远不会多次调用 finalize
方法。
finalize
方法引发的任何异常 finalize
导致终止此对象的终止,但会被忽略。