ExoPlayer之Extractor
Extractor的作用
代码中关于Extractor的注释说明 - Extracts media data from a container format.
Extractor对应于媒体文件解封装的处理:
解封装的 作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数 据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
接口说明
com.google.android.exoplayer2.extractor.Extractor:
public interface Extractor {
...
boolean sniff(ExtractorInput input) throws IOException, InterruptedException;
void init(ExtractorOutput output);
@ReadResult
int read(ExtractorInput input, PositionHolder seekPosition)
throws IOException, InterruptedException;
void seek(long position, long timeUs);
void release();
}
1 boolean sniff(ExtractorInput input)
通过对输入媒体数据流头信息的判断,决策当前Extractor是否能够处理输入的媒体数据。
2 void init(ExtractorOutput output)
初始化,接收输出类,只执行一次。
3 int read(ExtractorInput input, PositionHolder seekPosition)
解析封装格式数据,在seek位置读取数据输出到ExtractorOutput。
4 void seek(long position, long timeUs)
跳转。
Extractor的调用
DefaultExtractorsFactory。
由ProgressiveMediaSource使用。
内置的Extractors
@Override
public synchronized Extractor[] createExtractors() {
Extractor[] extractors = new Extractor[14];
extractors[0] = new MatroskaExtractor(matroskaFlags);
extractors[1] = new FragmentedMp4Extractor(fragmentedMp4Flags);
extractors[2] = new Mp4Extractor(mp4Flags);
extractors[3] =
new Mp3Extractor(
mp3Flags
| (constantBitrateSeekingEnabled
? Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING
: 0));
extractors