Android MediaExtractor

一、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)。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值