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 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人,所幸终会天亮。明天就是新的开始,我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen,这是一个 Rust 库和 CLI…

Cherno C++学习笔记 P48 如何让vector运行的更快

这一篇文章当中我们会讲到有关于vector的使用优化问题,如何能够让vector运行得更快。C优化是一个非常非常复杂的问题,最重要的是要了解环境,要知道事情是如何发生的,以及我们应该怎么做。当然我们今天会做的事情其实只是触及表面。…

MyBatis执行一条sql语句的流程(源码解析)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程(源码解析) MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向,有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念: Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio,區別是前者是cocos2djs專用的開發工具,後者則是coco…

吊舱激光测距核心技术详解!

一、核心技术 吊舱激光测距的核心技术主要体现在激光发射与接收、信号处理与距离计算、以及数据校正与优化等方面。 激光发射与接收: 激光发射器:产生经过调制的激光束,该激光束具有特定的频率和波形。这些激光束被投射到目标物体上。 光…

SpringAI从入门到熟练

学习SpringAI的记录情况 文章目录 前言 因公司需要故而学习SpringAI文档,故将自己所见所想写成文章,供大佬们参考 主要是为什么这么写呢,为何不抽出来呢,还是希望可以用的时候更加方便一点,如果大家有需求可以自行去…

如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取?2. 示例:使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取? 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…

GoldenDB组件及对应的用户和进程

1. GoldenDB组件及对应的用户和进程 GoldenDB数据库由管理节点、全局事务节点GTM、计算节点CN、数据节点DN等组成。 1.1. 管理节点 管理节点分为集群管理、Insight运维管理平台(InsightServer、RDB、ZK)。 1.1.1. 集群管理 1. 集群管理包括Metadatas…

认识编程-从思维方面看编程

如果说艺术通过色彩、线条和旋律将人类内心深处的梦想具象化,使之成为可以感知的视觉或听觉作品,那么计算机程序则是在数字世界中以逻辑和算法为画笔,描绘着创作者的构思与愿望。 编程是实现这一过程的语言和工具,它让那些抽象的…

小程序分包优化实践:解决主包过大和vendor.js体积问题

随着 uniapp 开发的小程序功能越来越复杂,主包的大小也逐渐增长,导致上传代码时遇到了2MB的限制。同时,由于微信小程序tabbar页面必须放在主包中,这进一步增加了主包的负担。为了提高用户体验并遵守平台规则,我们有必要…

Java Day1回顾简介-----变量命名规则

Java 简介、开发环境配置 菜鸟教程 编译运行 javac HelloWorld.java java HelloWorld Hello World public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World");} }JAVA基础语法 类、对象、方法、实例、变量 对象&a…

vue3 + element-ui + vue router的使用教程 基于HBuilderX

文章目录 前言1.安装vue router2.创建一个router.js文件 封装router3.在main.js中导入router.js4.使用el-menu5.在el-menu使用vue router6.运行项目查看效果如下 前言 开发环境基于 HBuilderX 本文主要介绍 element-ui的el-menu组件结合vue router的使用教程 el-menu组件 &am…

Dockerfile运行指令

1.RUN 在build构建时执行命令。 举例:安装vim Shell命令格式 RUN yum install -y vim Exec命令格式 RUN ["yum","install","-y","vim"] 2.CMD 用于设置容器启动时默认执行的命令或参数。 如果Dockerfile中有多个CMD&a…

【经管】上市公司供应链风险数据测算数据集+dofile(2008-2023年)

A股上市公司企业供应链风险是指在企业运营过程中,由于供应链各环节的波动和不稳定,导致企业面临的生产、销售和财务风险。随着市场环境的变化,A股上市公司在全球化竞争中暴露出越来越多的供应链风险问题。 一、A股上市公司企业供应链风险的介…

记录一个我在idea启动时的报错

这几天我的idea突然就不能用了我就想着下一个新的,但是却一直报错报错内容如下 这个是我在网上截的pycharm的。 我在网上查了很多方法都不能用,今天重写安装发现我点了关联.java 和.pom和创建环境变量 这几个只需要创建一个快捷方式就行。我重新安装之…

HTML5新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

138.WEB渗透测试-信息收集-小程序、app(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;137.WEB渗透测试-信息收集-小程序、app&#xff08;8&#xff09; 小程序的信息收集&…

TSN:工业通信的未来

一.传统以太网 1.竞争传输 传统以太网是基于竞争的传统以太网通信机制&#xff0c;当多个PC需要同一链路传输数据时&#xff0c;此时多个PC会竞争链路的使用权&#xff08;CSMA/CA&#xff09;。 如上图所示&#xff0c;当ES1向ES3传输大量非关键流量&#xff08;BE&#xff0…

如何将联系人从Android转移到 OPPO? [解决了]

概括 OPPO Reno4系列预计将于2020年10月1日上午9点30分举行线上发布会。从其官方预告片中我们不难发现&#xff0c;OPPO Reno4旗舰手机试图诠释梦想、挑战、勇气、自信和可能性。 3D曲面屏&#xff0c;图形流畅&#xff0c;机身更轻薄&#xff0c;色彩真实。听起来棒极了&…

[羊城杯 2024]不一样的数据库_2

题目描述&#xff1a; 压缩包6 (1).zip需要解压密码&#xff1a; 尝试用ARCHPR工具爆破一下&#xff1a; &#xff08;字典可自行在github上查找&#xff09; 解压密码为&#xff1a;753951 解压得到13.png和Kee.kdbx文件&#xff1a; 二维码图片看上去只缺了正常的三个角&…