自定义包装编解码器集成到 Android 中

2023-11-27

我需要开发一个自定义的“包装”视频编解码器并将其集成到 android 中(现在是 JB,稍后是 ICS)。我们想要使用 SIM 卡中的一些自定义解密密钥(不要问!)。最好的方法(允许它与其他非加密媒体一起工作并使用标准媒体播放器或其他)似乎是定义我们自己的 mime 类型,并将其链接到可以执行自定义操作的自定义包装编解码器解密,然后将数据传递给真正的编解码器。 (假设文件类型是.mp4目前。)

(另一种选择可能是编写我们自己的媒体播放器,但我们不想走这条路,因为我们真的希望媒体与其他媒体无缝地一起显示)

我一直在尝试遵循本指南:如何将解码器集成到多媒体框架中

  1. 我在 OMX Core 注册方面遇到问题 - 我可以构建libstagefright.so从 android 源代码中输入make stagefright但在指南中他说要使用libstagefrighthw.so这似乎适合 JB,但我不知道如何构建它,它似乎不是通过使用构建的make stagefright除非我做错了什么?

  2. 另一个问题是,即使我注册了自定义包装编解码器,我也不知道如何将数据传递给真正的编解码器。

如果有人有任何建议(或者可以给一些婴儿一步一步的指导!),我真的很感激 - 概念验证的截止日期非常紧迫,而且我对编解码器或媒体框架知之甚少......

非常感谢。 (附:我不想卷入关于drm和模拟孔等的泥浆战......,谢谢)


在这篇文章中,我使用H.264作为一个例子,但解决方案可以扩展以支持其他编解码器,例如MPEG-4, VC-1, VP8等等。有两种可能的解决方案可以解决您的问题,我在下面列出了它们,每种方案都有自己的优点和缺点,可以帮助您做出明智的决定。

解决方案1:扩展编解码器以支持新模式

In JellyBean,可以注册相同的OMX具有相同的组件MIME类型为 2 个不同的组件名称,即,OMX.ABC.XYZ and OMX.ABC.XYZ.secure。前者用于正常播放,是更常用的组件。当解析器即使用后者时MediaExtractor表明存在安全内容. In OMXCodec::Create, after findMatchingCodecs返回一个编解码器列表,我们可以观察选择的选项.secure组件为here.

应遵循的步骤:

  1. 在您的平台中,使用一些新扩展注册另一个组件,例如OMX.H264.DECODER.decrypt或类似的东西。仅需要更改media_codecs.xml。是注册一个新的工厂方法还是拥有一个通用的工厂方法是你的选择。

  2. 从解析器中,当您遇到特定用例时,设置一个新标志,例如kKeyDecryptionRequired。为此,您必须在中定义一个新标志Metadata.h以及相应的怪癖OMXCodec.h.

  3. 修改OMXCodec::create方法附加一个.decrypt后缀类似于.secure后缀如上图。

  4. 随着所有的变化OMXCodec, Metadata, MediaExtractor模块,您只需重建libstagefright.so并在您的平台上替换相同的内容。

瞧!您的集成应该已完成。现在是组件内部的主要挑战。作为组件实现的一部分,您应该能够区分普通组件创建和.decrypt组件创建。

从运行时的角度来看,假设您的组件知道它是一个.decrypt组件与否,你可以处理decryption作为OMX_EmptyThisBuffer调用,您可以在其中解密数据,然后将其传递给底层编解码器。

Pros:易于集成、Android 框架变化最小、可扩展到其他编解码器、无新内容MIME需要类型注册。

Cons:您需要跟踪 Android 的未来修订,特别是新的怪癖、标志和选择.decrypt扩大。如果谷歌决定采用类似的东西,你将不得不相应地调整/修改你的解决方案。

解决方案 2:注册新的 MIME 类型

从您的问题来看,尚不清楚您是否能够定义MIME无论是否键入,因此,为了清楚起见,我将捕获这些步骤。

应遵循的步骤:

  1. 注册一个新的MIME键入MediaDefs如图所示here。例如,您可以雇用一个新的MIME输入为const char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";

  2. 使用此更新注册您的新组件MIME输入media_codecs.xml。请注意,您必须确保组件的怪癖也得到相应的处理。

  3. In OMXCodec::setVideoOutputFormat方法实现,您将必须引入处理新方法的支持MIME键入如图所示H.264 here。请注意,您将必须处理类似的更改OMXCodec以支持新的MIME type.

  4. In MediaExtractor,你必须发出信号MIME类型为video使用新定义的类型进行跟踪。通过这些更改,您的组件将被选择并创建。

However,挑战仍然存在:在哪里执行解密?为此,您也可以采用与上一节中描述的相同的解决方案,即处理相同的部分OMX_EmptyThisBuffer call.

Pros:没有我能想到的..

Cons:首先,解决方案不可扩展。您将不得不不断添加新的MIME类型并不断修改Stagefright框架。接下来,变化OMXCodec将需要相应的改变MediaExtractor。因此,即使您最初的重点是MP4extractor,如果您希望将解决方案扩展到其他容器格式,例如AVI, MKV,您将必须包括对新的支持MIME这些提取器中的类型。

Lastly,一些笔记。

  1. 作为首选解决方案,我推荐解决方案 1,因为它简单易行。

  2. 我没接触过ACodec基于编解码器的实现。然而,我确实认为解决方案 1 将是一个更容易实施的解决方案,即使将来需要这样的支持。

  3. 如果您不修改OMX核心,你不应该要求修改libstagefrighthw.so。仅供参考,这通常由供应商作为其供应商特定模块的一部分来实现,如下所示vendor/<xyz>/hardware/...。您需要向您的平台提供商核实其来源libstagefrighthw.so.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义包装编解码器集成到 Android 中 的相关文章

  • 如何使用 gradle 从 3 个子模块构建 1 个 jar

    I have 安卓工作室3 gradle 4 1 梯度工具3 classpath com android tools build gradle 3 0 1 当我有一个模块并使用 gradle 工具 2 时 我使用了 task makeJar
  • Android 应用程序安装失败:包 com.my.app 在条目 AndroidManifest.xml 处没有证书

    在 Android Studio 中 我生成了带有密钥库等的签名 APK 将 APK 安装到设备上时失败 并显示 无法安装应用程序 并且在 Android Monitor 中我看到以下行 Package com my app has no
  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • Android 中的 Fragment-Fragment 通信

    我在Android编程方面处于初级水平 所以我需要你真诚的帮助 请任何人帮助我 我正在尝试使用片段构建滑动用户界面 所以我真正的疑问是 我有一个Fragment say FragmentA 它有一个TextView and Button在其
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 华为手机“受保护的应用程序”设置及处理方法

    我有一台搭载 Android 5 0 的华为 P8 用于测试应用程序 该应用程序需要在后台运行 因为它跟踪 BLE 区域 我发现华为内置了一个名为 受保护的应用程序 的 功能 可以从手机设置 电池管理器 gt 受保护的应用程序 访问该功能
  • 错误类型 3 - 活动类不存在

    我正在尝试运行 webRTC 应用程序 但返回以下错误 启动应用程序 com onlinevoicecallapp com onlinevoicecallapp MainActivity 设备外壳命令 am start n com onli
  • 如何禁用操作栏上“向上”按钮的翻转?

    背景 我做了一个 应用程序管理器 https play google com store apps details id com lb app manager 替代应用程序 我希望添加 RTL 从右到左 语言的翻译 因为我知道在某些 And
  • 选项卡主机内的 Android Fragment 视图状态 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Fragment 为 Android 中的每个选项卡单独的返回堆栈 https stackoverflow com questions 6987334 separate back stack f
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • 哪个视图最亮?

    在Android中 哪个是轻量级视图 例如 View Textview Edittext 等 在某些情况下 我们需要使用视图来填充区域而不向用户显示视图 同时屏幕加载速度应该很快 您可以使用空间 android widget Space S
  • onTaskRemoved() 在华为和小米设备中没有被调用

    我一直在使用onTaskRemoved 服务中的方法 用于检测应用程序何时通过滑动从设备最近列表中删除 我执行一些日志记录和发生这种情况时需要执行的一些其他操作 它工作完美 然后我在运行Android 6 0的华为设备上检查了这个方法 该方
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try

随机推荐

  • 如何将 Bullet 物理应用于绘制的 Opengl 3d 形状

    我只是想知道是否有一种方法可以将子弹物理应用于 opengl 绘制的对象 使用 glVertex3f 或带有 glVertexAttribPointer 的三角形网格创建 我目前正在使用 jogl 和 jbullet 将物理应用到我的 3D
  • 尝试播放声音时出现“play() 失败,因为用户没有先与文档交互”错误 (javascript/html)

    我正在尝试使用 javascript 在网页上播放声音 但每当我这样做时 我都会收到上述错误 这是我的代码 if thing startsWith 0 var a new Audio audio mp4 a play 此外 如果您打开控制台
  • 如何设置 Elastic beanstalk Windows 应用程序的文件夹权限?

    我目前正在构建一个 C WebApi 2 应用程序 我将其上传到 Amazon Elastic Beanstalk 实例进行部署 到目前为止 我取得了成功 并且在我的本地计算机上 我刚刚完成了文件上传功能的测试 以便客户端上传图像 它的方式
  • 在 VirtualBox 来宾中运行 perf

    我的教授要求我跑步 perf stat e mem loads mem stores test 为了让我找到 C 文件的内存加载和存储 我在 VirtualBox Linux 来宾中执行此操作 问题是perf说这是无效或不受支持的事件 任何
  • 在 Clion 中启用 Cuda 代码索引

    我正在使用 Clion 开发 cuda 程序 当扩展名是 h 时 代码突出显示可以正常工作 但是 当它更改为 cuh 时 Clion 仅将新文件视为纯文本文件 并且我无法启用代码突出显示 我知道完整的 Cuda 工具链是不可能的 所以我不希
  • 为 Outlook 2007 构建表单

    我刚刚了解到 Outlook 表单的概念 我不知道这是否能解决我的问题 但这就是我想做的 我希望能够让公司内部的员工填写一些表格 那么我所要做的就是创建表单并将其推送到他们的 Outlook 中 他们填写表格后 我可以以某种方式捕获数据吗
  • WebAPI OData $格式转换为xml

    对于我的 WebAPI OData 应用程序 我试图让我的客户端 浏览器 决定数据输出应该采用什么格式 作为 format尚未在 WebAPI OData 中实现 我在这里使用 Raghuramn 的示例 https gist github
  • React + Typescript:如何输入 event.target.name 来声明?

    我有一些反应状态被定义为一个接口并且有专门命名的键 我尝试了下面的解决方案 该解决方案在技术上应该基于状态键工作 但它仍然给我错误 x string string provides no match for the signature 做这
  • 有没有一种简单的方法可以使用 Microsoft Web Optimization 框架/脚本捆绑来呈现绝对 URL?

    我正在尝试使用 Microsoft 的 Web Optimization 框架呈现 JavaScript 包 如下所示 Scripts Render assets bundle js 并构建一个小包 如下所示 public static v
  • Fabric API 密钥无效

    我正在尝试将 Fabric 安装到我的 iOS 应用程序中 我下载了 Fabric 应用程序来安装 Crashlytics 但是当我在应用程序提供的构建阶段添加运行脚本时 在构建项目后出现错误 第 2 行 1 myfirebaseid io
  • 在 PowerShell 代码中测试文件夹是否是连接点?

    如何在 PowerShell 代码中测试文件夹是否是连接点 至少从 PowerShell v5 0 开始 对链接有了更好的支持 或者 MS 称之为 重新分析点 改进的 Item cmdlet LinkType财产 链接的文章位于 WMF 5
  • 如何访问未导出的结构体字段

    Go 1 8 中有没有办法使用 Reflect 来访问未导出的字段 这似乎不再有效 https stackoverflow com a 17982725 555493 注意reflect DeepEqual工作得很好 也就是说 它可以访问未
  • 禁用对读取(无效 JSON)单引号字符串的支持

    Newtonsoft Json for C 支持读取类似内容 key value 但这是不正确的 JSON 是否可以禁用它 以便它更像 PHP 一样解析和读取 其中 PHP 不支持 key value 但 key value 你可以自己写J
  • 编译所需的BLAS和LAPACK库

    我最近下载了 Gnu Octave 的最新稳定版本 并尝试在我的机器上构建并安装它 Ubuntu 10 0 4 LTS 64 位 当我运行 configure 时 我收到以下错误消息 configure error You are requ
  • Scala @ 运算符

    Scala 的 运算符有什么作用 例如 在博客文章中Scala 中的形式语言处理 第 2 部分有这样的东西 case x Some Nil gt x 它使人们能够将匹配的模式绑定到变量 例如 考虑以下情况 val o Option Int
  • 如何将 stringstream 内容放入 char 而不是 string 类型?

    大家都知道stringstream str 需要一个字符串变量类型来存储内容stringstream str 进去 我想存储的内容stringstream str 转换为 char 变量或 char 数组或指针 可以这样做吗 请写一个简单的
  • 为什么我的正则表达式与 r'string' 匹配,但使用 Python 时不匹配 'string'?

    正则表达式在 Python 中的工作方式是如此令人费解 以至于每一秒都让我更加愤怒 这是我的问题 我知道这给出了一个结果 re search r bmi b grand rapids mi 49505 虽然这没有 re search bmi
  • 迅速。无主相对于弱者的(绝对)唯一的具体优势是性能吗?

    在 Swift 中 我们有正常的默认类型 该对象根本不能变为零 我们有弱类型 该对象可以变为零 如果对象变成nil 你的指针自动变成nil 所以你知道对象变成了nil 我们有无主打字 该对象可以变为零 如果对象变成 nil 你的指针不会发生
  • Gstreamer tcpserversink v0.10 与 1.0 和 HTML5 视频标签

    我正在我的网站中嵌入 HTML5 视频标签 来源是 gstreamer 流 我有一个正在处理 gst 0 10 的管道 gst launch 0 10 v videotestsrc theoraenc oggmux queue tcpser
  • 自定义包装编解码器集成到 Android 中

    我需要开发一个自定义的 包装 视频编解码器并将其集成到 android 中 现在是 JB 稍后是 ICS 我们想要使用 SIM 卡中的一些自定义解密密钥 不要问 最好的方法 允许它与其他非加密媒体一起工作并使用标准媒体播放器或其他 似乎是定