文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 10:52

关注

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

MediaExtactor

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

使用MediaExtactor

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

加载音视频文件代码

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

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

获取轨道代码

加载文件之后可以通过MediaExtactorgetTrackCount方法获取到所有数据轨道。然后可以通过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;

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯