Android 上的 MP3 解码

2024-01-04

我们正在为 Android 手机实现一个程序,用于播放来自互联网的音频流。我们所做的大约如下:

  1. 下载自定义加密格式。
  2. 解密以获取常规 MP3 数据块。
  3. 将 MP3 数据解码为内存缓冲区中的原始 PCM 数据。
  4. 将原始 PCM 数据传送到 AudioTrack

到目前为止,我们的目标设备是 Droid 和 Nexus One。在 Nexus One 上一切正常,但在 Droid 上 MP3 解码速度太慢。如果我们将 Droid 置于负载状态,音频播放就会开始跳过。我们不被允许将 MP3 数据解码到 SD 卡,但我知道这不是我们的问题。

我们没有编写自己的MP3解码器,而是使用了MPADEC(http://sourceforge.net/projects/mpadec/ http://sourceforge.net/projects/mpadec/)。它是免费的,并且很容易与我们的程序集成。我们使用 NDK 编译它。

在使用各种分析工具进行详尽的分析后,我们确信正是这个解码器落后了。

以下是我们正在考虑的选项:

  1. 找到另一个可以使用 Android NDK 编译的 MP3 解码器。该 MP3 解码器必须经过优化才能在移动 ARM 设备上运行,或者可能使用纯整数数学或其他一些优化来提高性能。

  2. 由于内置的​​ Android MediaPlayer 服务将获取 URL,因此我们可以在程序中实现一个小型 HTTP 服务器,并为 MediaPlayer 提供解密的 MP3。这样我们就可以利用内置的 MP3 解码器。

  3. 通过 NDK 访问内置 MP3 解码器。我不知道这是否可能。

有人对我们可以采取哪些措施来加快 MP3 解码速度有任何建议吗?

-- 罗布·史兹


正确的方法是构建您自己的固件并作为自定义 OpenCORE 编解码器的一部分进行解密。当然,这将限制您只能安装该固件的设备。

请记住,其余部分都有些推测性。我实际上需要做一些类似于你所描述的事情,但我没有几个月的时间来解决这个问题。因此,我将以我处理问题的方式来描述这一点。

一种解决方案是 twk 的答案中描述的解决方案。您不必使用 SD 卡,但您可能必须在应用程序本地文件存储中拥有一个世界可读的临时文件(getFilesDir())。下载第一个块,解密它,将其写为一个完整的世界可读的 MP3 文件(但具有适当模糊的目录/路径),然后将其交给MediaPlayer via setDataSource()。当播放时,您下载/解密并设置第二个MediaPlayer例如,第一个结束后立即开始播放,以实现尽可能无缝的过渡。然后你重置第一个MediaPlayer并将其与第三个块一起重复使用,在两个块之间进行乒乓球运动。

相关的解决方案将在 jleedev 的评论中。这几乎是一样的事情,除了你提供了一个FileDescriptor via a ContentProvider。它有一个选项可以让你使用套接字,may让您避免临时文件。但是,那ContentProvider其本身必须是可公开访问的,因此具有模糊目录的临时文件实际上可能更加私密。

如果您担心这些东西可以被其他进程读取,请理解MediaPlayer它本身(或者更确切地说,OpenCORE 子系统)处于另一个进程中。此外,您建议的 HTTP 服务器在设备上也是可读的。因此,如果您想让MediaPlayer进行解码。

AFAIK,NDK 不授予对 OpenCORE 的访问权限,尽管我承认我的 NDK 经验有限,所以我可能是错的。当然还有其他可用的 MP3 解码器(ffmpeg/mplayer等),但如何将它们转换为 NDK 库尚不清楚。

所以,这实际上取决于你要防守的对象。如果您试图防御用户,您可能必须以某种方式自己对其进行解码。

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

Android 上的 MP3 解码 的相关文章

  • 带身份验证的 MediaPlayer RTSP 视频流

    我能够在未经授权的情况下从网络摄像机流式传输视频 但现在我需要在授权的情况下执行此操作 我发现很少有信息表明 Android 不支持 RTSP 身份验证 但我发现另一条信息表明 通过使用该方法添加标头 可以在 API 级别 14 中实现身份
  • 致命异常:Google 地图 V2 中的 GLThread、StackOverflowError

    我正在实施 Google 地图 V2 并利用从外部 GPX 文件接收的交付路线 设备路径 设备当前位置和交付点位置 问题是它大多数时候都有效 我收到的错误 当它不起作用时 是下一个 03 16 20 48 37 811 I dalvikvm
  • 读取 Android 4.2 中的 APN?

    我有个问题阅读 APN在安卓v4 2中 是读 不是写APNS 它抛出一个安全异常 没有写入 APN 设置的权限 用户 10068 和当前用户都没有权限 进程有 android permission WRITE APN SETTINGS 相同
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • 如何编写 adb jdwp + adbforward 脚本?

    我正在尝试使用命令行和脚本工具调试 Android 应用程序 我已经受够了 Android Studio 占用我的 CPU 要连接到我的应用程序 我需要adb jdwp获取 pid 然后adb forward tcp 8700 jdwp
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • 拥有可重用对话框的最佳方法是什么?

    在 Android 中创建可重用对话框的最佳方法是什么 阅读通过对话框开发指南 http developer android com guide topics ui dialogs html 我知道我可以使用AlertDialog Buil
  • 可下载字体例外

    我决定使用可下载字体 https developer android com guide topics ui look and feel downloadable fonts html在我的项目中 IS 按照指南中的建议实施了所有内容 当我
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 应用程序运行时相对布局中的元素显示不同

    我有一个ListView在片段内创建 并且它有一个搜索过滤器 问题是 XML 布局在 android studio 中显示正常 但在模拟器或手机中运行时 它显示不同 与我对齐时不正确 并且当我单击SearchView它位于选项卡导航下方 谁
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • 如何在jetpack compose中删除文本基线下方的空间?

    目前我得到这个 但我想要这样的东西 而且 50 和 min 中的文本也应该与顶部对齐 My code Row verticalAlignment Alignment Bottom Text text 18 color MaterialThe
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • Android 使用不同的签名密钥更新市场应用程序

    开发人员使用他的个人密钥库签署了应用程序 但它应该是公司的密钥库 现在是否可以使用公司的密钥库更新市场中的应用程序 并且仍然可以简化对用户的更新 这有什么后果吗 不可以 您必须将该应用程序作为新应用程序发布到市场上 这次是用公司的key签名

随机推荐

  • 如何在 Firefox 中使用“Start”和“End”在 Iframe 中选择一个范围,例如输入元素中的“selectionStart”

    对于 Internet Explorer 我有当前的代码来选择 iframe 中的范围 并将 desingMode 设置为 on var Range window document selection createRange var obj
  • 以编程方式重新加载 Java JAR,无需重新启动 ColdFusion

    背景 从 ColdFusion 10 开始 可以包含来自自定义位置的 JAR http help adobe com en US ColdFusion 10 0 Developing WSe61e35da8d318518 106e125d1
  • PHP中如何判断一个字符串是否是一个数学语句?

    我有这个字符串作为例子 2 2 2 当评估时它应该返回int 2 我正在寻找一个函数 解析器 可以确定字符串中是否匹配任何类型的数学内容 更多示例 2 2 2 4 8 12 128 8 不需要评估和计算这些数学表达式 只需要一个函数来确定
  • 如何获取 Titan 中的索引键列表?

    我正在使用 Titan v0 3 1 并且希望查看我已经通过索引建立索引的键的列表createKeyIndex 我怎样才能做到这一点 在 Gremlin shell 中 您可以使用蓝图键可索引图 https github com tinke
  • Docker 中的 Apache / PHP error_log 位置

    我的 PHP 脚本有错误 例如 屏幕上显示 警告 require var www foo php 无法打开流 我在日志中哪里可以找到这个 I tried docker logs containerName 但它只显示访问日志 例如 192
  • SQLAlchemy 和多进程的连接问题

    我在一个项目中使用 PostgreSQL 和 SQLAlchemy 该项目由启动子进程的主进程组成 所有这些进程都通过 SQLAlchemy 访问数据库 我遇到可重复的连接失败 前几个子进程工作正常 但一段时间后会出现连接错误 这是一个 M
  • 检查安装的网络打印机是否在线

    我想检查打印机是否在线 为此我得到了 OpenPrinter 的打印机句柄 然后我想使用 PRINTER STATUS OFFLINE 在 PRINTER INFO 6 中使用 GetPrinter 结果总是0 如何获取打印机的离线状态 我
  • 向条形图添加水平线

    我正在尝试使用R plotly s bar输入plot 来生成一个带有水平布局的框的图 并在其背景中添加一条水平线 而不是在它们的顶部 另外 我希望这条线在每个方向上对称地延伸一个盒子单元 这就是我正在做的 plot df lt data
  • android 在模拟器或设备中执行?

    有什么方法可以知道我的应用程序是在模拟器上还是在设备上运行 我使用的代码片段适用于 Intel 和 ARM 模拟器 if Build MODEL contains google sdk Build MODEL contains Emulat
  • `npmaudit` 不断返回“您配置的注册表 (https://registry.npmjs.org/) 不支持审核请求。”。我怎样才能让它再次工作?

    这是我得到的错误 npm ERR code ENOAUDIT npm ERR audit Your configured registry https registry npmjs org does not support audit re
  • 带有 @init 块的 ANTLR4 词法分析器规则

    我在 ANTLR v3 语法文件中定义了这个词法分析器规则 它的数学文本用双引号引起来 我需要将其转换为 ANTLR v4 ANTLR 编译器抛出错误 语法错误 在匹配词法分析器规则时不匹配输入 期望冒号 在 init 行中 词法分析器规则
  • 使用 C# 无法正确更改应用程序图标

    我将应用程序的图标更改为新图标 方法是转到 Project MyProject Properties Icon and Maniferest 然后加载新图标 现在 在我的调试文件夹中 我的 exe 文件的图标出现了新图标 这没关系 但是当我
  • Google App Engine 删除了默认 GCS 存储桶。有办法恢复吗?

    我正在从应用程序的默认存储桶中删除一些文件 并且不小心还使用 gsutil rm 命令删除了存储桶本身 有没有办法恢复 重新创建 恢复它 我想继续使用免费配额而不启用计费 到目前为止我试图做的是 但我不确定它是否正确 我首先启用计费只是为了
  • HTML 表格忽略元素样式宽度

    HTML 表格忽略元素样式宽度 我有一个 HTML 表格 其中某些单元格具有很长的文本内容 我想使用 jQuery 为这些单元格指定宽度 以像素为单位 但渲染的表格只是忽略给定的宽度 有什么方法可以强制表格遵守这个宽度吗 Thanks JS
  • 测量 OpenCV FPS

    我正在寻找一种正确的方法来测量 openCV FPS 我找到了几种方法来做到这一点 但它们都不适合我 我测试过的第一个使用time t 开始和 time t 结束 我认为一旦它返回一个转储的函数作为 fps x 时间图 我真的无法想象 fp
  • 将行号添加到现有 HTML

    我正在尝试向现有的 html 添加行号 行高不等 许多类型的字体大小和图像 每条线看起来像 div div
  • 如何使用适用于 Node.js 的 AWS 开发工具包在 s3 上创建文件夹或密钥?

    我正在使用适用于 Node js 的 AWS 开发工具包在 s3 上创建文件夹或密钥 我在谷歌上搜索 但一无所获 有谁知道如何使用适用于 Node js 的 AWS SDK 在我的存储桶下创建文件夹 如何检查您的存储桶中是否已存在该文件夹
  • 实体组件系统和共享公共基础类型的多个组件

    我正在尝试为我的游戏引擎实现一个简单的 ECS 我知道我的实现并不是严格意义上的 ECS 但我正在重构我的代码以使其更加基于组件 到目前为止 我有以下课程 Entity 它是组件的容器 并且由于我希望我的实体具有相同类型的多个组件 因此它将
  • 具有易失性或锁定的属性

    我有一个带有支持字段的属性 我想使其线程安全 获取和设置 get和set方法除了设置和返回之外没有任何逻辑 我认为有两种方法可以将逻辑封装在属性 self 中 易失性和锁定 我对两者的理解是正确的还是有错误 以下是我的例子 public c
  • Android 上的 MP3 解码

    我们正在为 Android 手机实现一个程序 用于播放来自互联网的音频流 我们所做的大约如下 下载自定义加密格式 解密以获取常规 MP3 数据块 将 MP3 数据解码为内存缓冲区中的原始 PCM 数据 将原始 PCM 数据传送到 Audio