Android MediaExtractor JNI 实现详解

Android MediaExtractor JNI 实现详解

1. 概述

在 Android 多媒体框架中,MediaExtractor 是一个关键的组件,用于从多媒体文件中提取音视频数据。它能够解析多种格式的媒体文件,并从中提取出音频、视频等轨道数据,供后续的 MediaCodec 进行解码和播放。本文将深入探讨 MediaExtractor 的 JNI 实现,涵盖其功能、设计架构、通信原理以及如何进行定制扩展。

2. 功能介绍

MediaExtractor 的主要功能是从媒体文件中提取音视频数据,并将其提供给 MediaCodec 进行解码。具体功能包括:

  • 数据源设置:支持从文件路径、文件描述符、MediaDataSource 等多种数据源中提取数据。
  • 轨道管理:能够获取媒体文件中的轨道数量,并选择或取消选择特定的轨道。
  • 数据读取:从选定的轨道中读取样本数据,并获取样本的时间戳、标志等信息。
  • 格式信息:获取媒体文件的全局格式信息以及每个轨道的格式信息。
  • 加密支持:支持从加密的媒体文件中提取数据,并提供加密信息。
  • 缓存管理:提供缓存数据的时长和是否到达流末尾的信息。

3. 设计架构

MediaExtractor 的 JNI 实现主要分为以下几个部分:

3.1 JNI 接口层

JNI 接口层是 Java 层与 C++ 层之间的桥梁,负责将 Java 层的调用转换为 C++ 层的实现。在 MediaExtractor 中,JNI 接口层通过 android_media_MediaExtractor.cpp 文件实现,定义了与 Java 层 MediaExtractor 类对应的方法。

3.2 C++ 实现层

C++ 实现层是 MediaExtractor 的核心部分,负责实际的媒体数据提取工作。它通过 NuMediaExtractor 类来实现媒体数据的解析和提取。NuMediaExtractor 是 Android 多媒体框架中的一个重要组件,支持多种媒体格式的解析。

3.3 数据源层

数据源层负责提供媒体数据,支持从文件、网络、MediaDataSource 等多种数据源中读取数据。在 MediaExtractor 中,数据源层通过 DataSource 类及其子类来实现。

3.4 加密支持层

加密支持层负责处理加密的媒体文件,提供解密所需的信息。在 MediaExtractor 中,加密支持层通过 ICas 接口及其实现类来实现。

4. 通信原理

MediaExtractor 的 JNI 实现通过 JNI 接口层将 Java 层的调用传递给 C++ 层,C++ 层通过 NuMediaExtractor 类进行媒体数据的解析和提取。具体通信流程如下:

  1. Java 层调用:Java 层的 MediaExtractor 类通过 JNI 接口调用 C++ 层的实现。
  2. JNI 接口层:JNI 接口层将 Java 层的调用转换为 C++ 层的函数调用,并传递必要的参数。
  3. C++ 实现层:C++ 实现层通过 NuMediaExtractor 类进行媒体数据的解析和提取,并将结果返回给 JNI 接口层。
  4. JNI 接口层返回:JNI 接口层将 C++ 层的返回结果转换为 Java 层的对象或值,并返回给 Java 层。

5. 定制扩展

MediaExtractor 的 JNI 实现提供了良好的扩展性,开发者可以根据需要进行定制和扩展。以下是一些常见的扩展场景:

5.1 支持新的媒体格式

如果需要支持新的媒体格式,可以通过扩展 NuMediaExtractor 类来实现。具体步骤如下:

  1. 实现新的解析器:实现一个新的解析器类,继承自 NuMediaExtractor,并重写其解析方法。
  2. 注册解析器:在 MediaExtractor 的初始化过程中,注册新的解析器类。
  3. 测试验证:通过测试验证新的解析器是否能够正确解析新的媒体格式。

5.2 支持新的数据源

如果需要支持新的数据源,可以通过扩展 DataSource 类来实现。具体步骤如下:

  1. 实现新的数据源类:实现一个新的数据源类,继承自 DataSource,并重写其读取方法。
  2. 注册数据源:在 MediaExtractor 的初始化过程中,注册新的数据源类。
  3. 测试验证:通过测试验证新的数据源是否能够正确提供媒体数据。

5.3 支持新的加密方案

如果需要支持新的加密方案,可以通过扩展 ICas 接口来实现。具体步骤如下:

  1. 实现新的加密类:实现一个新的加密类,继承自 ICas,并重写其解密方法。
  2. 注册加密类:在 MediaExtractor 的初始化过程中,注册新的加密类。
  3. 测试验证:通过测试验证新的加密类是否能够正确解密媒体数据。

6. 代码分析

以下是对 MediaExtractor JNI 实现的关键代码分析:

6.1 JNI 接口层

static const JNINativeMethod gMethods[] = {
   
    {
    "release", "()V", (void *)android_media_MediaExtractor_release },
    {
    "getTrackCount", "()I", (void *)android_media_MediaExtractor_getTrackCount },
    {
    "getFileFormatNative", "()Ljava/util/Map;", (void *)android_media_MediaExtractor_getFileFormatNative },
    {
    "getTrackFormatNative", "(I)Ljava/util/Map;", (void *)android_media_MediaExtractor_getTrackFormatNative },
    {
    "selectTrack", "(I)V", (void *)android_media_MediaExtractor_selectTrack },
    {
    "unselectTrack", "(I)V", (void *)android_media_MediaExtractor_unselectTrack },
    {
    "seekTo", "(JI)V", (void *)android_media_MediaExtractor_seekTo },
    {
    "advance", "()Z", (void *)android_media_MediaExtractor_advance },
    {
    "readSampleData", "(Ljava/nio/ByteBuffer;I)I", (void *)android_media_MediaExtractor_readSampleData },
    {
    "getSampleTrackIndex", "()I", (void *)android_media_MediaExtractor_getSampleTrackIndex },
    {
    "getSampleTime", "()J", (void *)android_media_MediaExtractor_getSampleTime },
    {
    "getSampleFlags", "()I", (void 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【git】(一)在vscode上使用git进行版本控制(结合指令、含示例)

vscode中的git插件将git操作从git指令简化到简单的图形界面操作,不用再去记忆git指令,操作简单直观了很多。第一次使用时,为了加深理解,我将一些基本操作和该操作底层使用的命令结合起来,并包含实例,方便学…

安卓入门二 Kotlin基础

Kotlin Kotlin的历史 Kotlin由Jet Brains公司开发设计,2011年公布第一版,2012年开源。 2016年发布1.0正式版,并且Jet Brains在IDEA加入对Kotlin的支持,安卓自此又有新的选择。 2019年谷歌宣布Kotlin成为安卓第一开发语言&#x…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入…

线段树例题题解

卫星覆盖(NOI1997) 题面: SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…

FFmpeg 编码和解码

文章目录 音频格式AACADIF音频数据交换格式ADTS音频数据传输流 音频解码音频编码 视频格式H264GOP图像组I帧,P帧,B帧H264压缩技术H264压缩级别H264视频级别H264码流结构SPSPPS 解码视频编码视频 音频格式 AAC AAC全称 Advanced Audio Coding&#xff0…

vue 组件库二次封装

vue 组件库二次封装 需求背景:项目使用arco-design组件库,ui 界面对于单选有统一的界面, 对于封装组件有一个大原则就是我们应该尽量保持原有组件的接口,除了我们需要封装的功能外,我们不应该改变原有组件的接口&#…

Kafka 幂等性与事务

文章目录 幂等性实现机制配置使用局限性 事务使用场景配置使用实现机制事务过程事务初始化事务开始事务提交事务取消事务消费 幂等性 Producer 无论向 Broker 发送多少次重复的数据,Broker 端只会持久化一条,保证数据不丢失且不重复。 实现机制 通过引…

LVS 负载均衡原理 | 配置示例

注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境: Red Hat OpenShift Container Platform (RHOCP) 4 问题: Cluster Version Operator 不断发送警报,表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报: …

详解从输入url到页面渲染

当你在浏览器中输入一个 URL 并按下回车键,浏览器会经历一系列步骤来加载并渲染页面。这些步骤包括 DNS 解析、缓存处理、建立连接、发送请求、接收响应、解析 HTML、构建 DOM 树和 CSSOM 树、执行 JavaScript、布局和绘制等。以下是这些步骤的详细解释,…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统,其核心设计理念是将一切资源抽象为文件,即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

【蓝桥杯选拔赛真题85】python摆放箱子 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python摆放箱子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python摆放箱子 第十五届蓝桥杯青少年组python比赛选拔赛真题详细解析 一…

数据分析思维(六):分析方法——相关分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…

小程序中引入echarts(保姆级教程)

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…

【SQLi_Labs】Basic Challenges

什么是人生?人生就是永不休止的奋斗! Less-1 尝试添加’注入,发现报错 这里我们就可以直接发现报错的地方,直接将后面注释,然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

基于JAVA+SpringBoot+Vue的校园二手书交易平台

基于JAVASpringBootVue的校园二手书交易平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 …

快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 1、滚动查询的使用场景 滚动查询区别于上一篇文章介绍的使用from、size分页检索,最大的特点是,它能够检索超过10000条外的…

【C++】深入理解 break 和 continue 语句

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯break 和 continue 介绍**break** 的作用**continue** 的作用注意事项 💯break 示例代码示例**执行结果****解析过程** 💯continue 示例代码示例&am…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及,即便是零编程基础或基础薄弱的用户,也可以借助AI完成许多技术任务。然而,要高效地使用AI完成编程任务,关键在于如何清晰表达需求,并逐步引导AI实现目标。 在本文中,我们将通过开发…

算法每日双题精讲 —— 滑动窗口(水果成篮,找到字符串中所有字母异位词)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…