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!