千家信息网

Android音视频开发之MediaExtactor怎么使用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Android音视频开发之MediaExtactor怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"Android音视频开发之MediaExtactor怎么使用"文章能
千家信息网最后更新 2026年11月01日Android音视频开发之MediaExtactor怎么使用

本文小编为大家详细介绍"Android音视频开发之MediaExtactor怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"Android音视频开发之MediaExtactor怎么使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

MediaExtactor

MediaExtactor在Android音视频开发中负责提取音视频信息和数据流的功能,可以通过该类实现从多媒体文件中剥离得到音频和视频的能力。

使用MediaExtactor

在一个音视频文件多可能会包含多个数据流(音频数据、视频数据等一般情况是一个视频组合多个音频)

  • 因此需要MediaExtactor加载音视频文件获取到所有数据轨道

  • 通过遍历获取到想要操作的轨道

  • 然后指定该轨道是MediaExtactor所有解析的数据流

  • 通过MediaExtactor获取到该轨道MediaFormat

加载音视频文件代码

加载音视频文件过程可传递Uri、path、URL等。在确认希望需要解析的数据轨道后调用selectTrack就能锁定当前MediaExtactor要使用的轨道在之后数据解码中去使用。

// 加载资源MediaExtractor extractor = new MediaExtractor();extractor.setDataSource(path);// 遍历获取视频轨道int trackIndex = getTrackIndex(extractor, "audio/");// 选定轨道extractor.selectTrack(trackIndex);

获取轨道代码

加载文件之后可以通过MediaExtactor的getTrackCount方法获取到所有数据轨道。然后可以通过getTrackFormat获取到轨道信息,通过MediaFormat.KEY_MIME得到轨道格式比对期望所有获取到的轨道,比如比对"audio/"就是希望获取到音频轨道数据。

// 获取指定轨道的方法private static int getTrackIndex(MediaExtractor extractor, String mediaType) {    int trackIndex = -1;    for (int i = 0; i < extractor.getTrackCount(); i++) {        MediaFormat mediaFormat = extractor.getTrackFormat(i);        String mime = mediaFormat.getString(MediaFormat.KEY_MIME);        if (mime.startsWith(mediaType)) {            trackIndex = i;            break;        }    }    return trackIndex;}

提取轨道数据信息

在选定希望获取到的轨道后就可以获取到当前选择轨道的基本信息,例如视频尺寸大小、格式、时长、码率等一些音视频相关基础信息方便只有做解码时选用合适的解码器以及其他必要信息确认。

音频轨道基础信息获取

MediaFormatInfo mediaFormatInfo = new MediaFormatInfo();mediaFormatInfo.mediaFormat = mediaFormat;mediaFormatInfo.audioChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);mediaFormatInfo.audioSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);mediaFormatInfo.maxInputSize = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);mediaFormatInfo.mime = mediaFormat.getString(MediaFormat.KEY_MIME);

视频轨道基础信息获取

MediaFormatInfo mediaFormatInfo = new MediaFormatInfo();mediaFormatInfo.mediaFormat = mediaFormat;mediaFormatInfo.videoHeight = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);mediaFormatInfo.videoWidth = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);mediaFormatInfo.timeDuration = mediaFormat.getLong(MediaFormat.KEY_DURATION);mediaFormatInfo.mime = mediaFormat.getString(MediaFormat.KEY_MIME);

但如果你选取的轨道是视频轨道但操作错误提取了音频相关信息可能会出现错误崩溃的情况(例如KEY_IS_ADTS 只有音频轨道才能提取),因此尽量保证提取参数是否正确做好代码保护机制。

一些源码细节分析

MediaExtactor作为提取器,其底层代码逻辑也是调用JNI来实现的,它只是上层API提供出能力而已。 在源码细节中可以看到MediaExtactor同样是加载media_jniso库,这和MediaPlayer是一样的逻辑。

public MediaExtractor() {    native_setup();}private native final void native_setup();static {    System.loadLibrary("media_jni");    native_init();}

同时setDataSoure方法调用底层native接口和MediaPlayer也是同样的方法名和入参。

private native final void nativeSetDataSource(        @NonNull IBinder httpServiceBinder,        @NonNull String path,        @Nullable String[] keys,        @Nullable String[] values) throws IOException;

这基本也能够了解MediaExtactor和MediaPlayer在底层实现上应该属于同一套逻辑和功能。只不过MediaExtactor可以理解为MediaPlayer其中一小部分功能提供提取能力而MediaPlayer是封装成型的工具类只需要加载音视频资源文件播放即可,中间提取轨道和解析过程直接就在底层帮开发者实现了。

读到这里,这篇"Android音视频开发之MediaExtactor怎么使用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

轨道 音视 数据 信息 文件 视频 音频 开发 代码 底层 方法 功能 可以通过 基础 数据流 文章 细节 能力 逻辑 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 伟宏互联网科技 厦门中拓互联网络科技有限公司 互联网金融 科技金融 智网互联网科技 互联网 的科技创新 安徽鑫晟辉互联网科技 互联网科技logo设计 互联网科技英文翻译 云创客互联网科技公司 受益于互联网科技的高速发展 互联网金融中的现代科技 岳阳华臻互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 米聚互联网科技南京有限公司排面 东莞新华互联网科技学校 互联网行业科技股 互联网领先科技宣传片 互联网科技快讯热点 西安有哪些互联网高科技企业 互联网的黑科技实验室 互联网高科技 华服互联网科技怎么样 深圳互联网络科技有限公司 互联网科技论文 科技与互联网的利与弊 金融科技与互联网金融相同和不同 来此购互联网科技有限公司 银川新华互联网科技学校联系电话 深圳市罗太互联网科技有限公司 阿里互联网科技企业
0