一、MediaExtractor介绍
MediaExtractor是Android系统中的媒体解封装库,它可以从视频或音频文件中提取媒体轨道的数据,例如视频、音频、字幕等,并将其分离出来,提供给应用程序进行解码、处理和播放。需要注意的是,MediaExtractor只能解封装媒体文件中的音视频等媒体轨道,而不能解析整个媒体文件的结构。如果需要解析整个媒体文件的结构,需要使用其他库或框架。MediaExtractor支持的格式包括但不限于MP4、3GP、MKV、FLV等。
以下是一个简单的使用MediaExtractor提取音频数据的例子:
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(filePath);
int audioTrackIndex = -1;
for (int i = 0; i < extractor.getTrackCount(); i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("audio/")) {
audioTrackIndex = i;
break;
}
}
if (audioTrackIndex >= 0) {
extractor.selectTrack(audioTrackIndex);
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);
while (extractor.readSampleData(buffer, 0) >= 0) {
int trackIndex = extractor.getSampleTrackIndex();
if (trackIndex != audioTrackIndex) {
break;
}
long presentationTimeUs = extractor.getSampleTime();
int flags = extractor.getSampleFlags();
int size = extractor.getSampleSize();
// 处理音频数据
// ...
extractor.advance();
}
}
extractor.release();
二、MediaExtractor相关类
MediaExtractor(JAVA)
MediaExtractor代码位于:
frameworks/av/media/libstagefright/MediaExtractor.cpp
MediaExtractor的定义:
public final class MediaExtractor {}
MediaExtractor(C++)
表示一个解封装器, 其通过IMediaExtractor的实现RemoteMediaExtractor对外提供服务, 其子类实现为MediaExtractorCUnwrapper, 这是一个CMediaExtractor的Wrapper, 该类其实是MPEG4Extractor对外的抽象。
MediaExtractor代码位于:
frameworks/av/media/libstagefright/MediaExtractor.cpp
frameworks/av/media/libstagefright/include/media/stagefright/MediaExtractor.h
MediaExtractor的定义:
class ExtractorAllocTracker {}
class MediaExtractor {}
MediaExtractorFactory
MediaExtractorFactory代码位于:
frameworks/av/media/libstagefright/MediaExtractorFactory.cpp
frameworks/av/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
MediaExtractorFactory的定义:
class MediaExtractorFactory {}
RemoteMediaExtractor
RemoteMediaExtractor代码位于:
frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp
frameworks/av/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
RemoteMediaExtractor的定义:
class RemoteMediaExtractor : public BnMediaExtractor {}
三、MediaExtractor API
boolean advance():前进到下一个样本。
int getSampleFlags():返回当前样本的标志。
long getSampleTime():以微秒为单位返回当前样本的呈现时间。
int getSampleTrackIndex():返回当前样本来源的轨道索引(如果没有更多样本可用,则返回-1)
final int getTrackCount():计算数据源中找到的曲目数量。
MediaFormat getTrackFormat(int index):获取指定索引处的曲目格式。
int readSampleData(ByteBuffer byteBuf, int offset):检索当前编码样本并将其存储在从给定偏移量开始的字节缓冲区中。
final void release():确保你在完成任务时释放任何资源,而不是依赖垃圾回收器在将来的某个时刻为你做这件事。
void seekTo(long timeUs, int mode):根据指定的模式,所有选定的曲目都会在请求的时间附近寻找。
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)。