解码ima4音频格式

2024-03-15

为了减少 iPhone 应用程序的下载大小,我压缩了一些音频文件。具体来说,我在命令行上使用 afconvert 将 .wav 格式更改为 .caf 格式(带 ima4 压缩)。

我读了this http://www.wooji-juice.com/blog/iphone-openal-ima4-adpcm.html(wooji-juice.com) 关于这个主题的精彩帖子。我在“解码 ima4 数据包”步骤中遇到问题。我查看了他们的示例代码,但我被困住了。请帮助使用一些伪代码或示例代码来指导我正确的方向。

Thanks!

附加信息: 这是我已完成的工作以及遇到的问题...... 我可以在模拟器和手机上播放 .wav 文件。 我可以在命令行上使用 afconvert 将 .wav 文件压缩为 .caf w/ ima4 压缩。我正在使用带有 CrashLanding 的 SoundEngine(我修复了一个内存泄漏)。 我修改了 SoundEngine 代码以查找 mFormatID 'ima4'。

我不明白上面链接的博客文章以“计算解压数据的大小”开头。为什么我需要这样做?另外,术语“数据包”指的是什么?我对任何类型的音频节目都很陌生。


收集完所有数据后友智果汁 http://www.wooji-juice.com/blog/iphone-openal-ima4-adpcm.html, 多媒体维基 http://wiki.multimedia.cx/index.php?title=Apple_QuickTime_IMA_ADPCM and Apple http://developer.apple.com/mac/library/technotes/tn/tn1081.html,这是我的建议(可能需要一些实验):

文件结构

  • Apple IMA4 文件由 34 字节的数据包组成。这是用于构建文件的数据包单元。
  • Each 34 bytes packet has two parts:
    • 前 2 个字节包含前导码:初始预测器和步骤索引
    • 剩下的 32 个字节包含声音半字节(4 位半字节用于检索 16 位样本)
  • 每个数据包有 32 字节的压缩数据,代表 16 位的 64 个样本。
  • 如果声音文件是立体声,则数据包是交错的(一个用于左,一个用于右);数据包数量必须为偶数。

Decoding

每个34字节的数据包将导致解压缩64个16位的样本。因此,未压缩数据的大小为每个数据包 128 字节。

解码伪代码如下:

int[] ima_index_table = ... // Index table from [Multimedia Wiki][2]
int[] step_table = ... // Step table from [Multimedia Wiki][2]
byte[] packet = ... // A packet of 34 bytes compressed
short[] output = ... // The output buffer of 128 bytes
int preamble = (packet[0] << 8) | packet[1];
int predictor = preamble && 0xFF80; // See [Multimedia Wiki][2]
int step_index = preamble && 0x007F; // See [Multimedia Wiki][2]
int i;
int j = 0;
for(i = 2; i < 34; i++) {
    byte data = packet[i];
    int lower_nibble = data && 0x0F;
    int upper_nibble = (data && 0xF0) >> 4;

    // Decode the lower nibble
    step_index += ima_index_table[lower_nibble];
    diff = ((signed)nibble + 0.5f) * step / 4;
    predictor += diff;
    step = ima_step_table[step index];

    // Clamp the predictor value to stay in range
    if (predictor > 65535)
        output[j++] = 65535;
    else if (predictor < -65536)
        output[j++] = -65536;
    else
        output[j++] = (short) predictor;

    // Decode the uppper nibble
    step_index += ima_index_table[upper_nibble];
    diff = ((signed)nibble + 0.5f) * step / 4;
    predictor += diff;
    step = ima_step_table[step index];

    // Clamp the predictor value to stay in range
    if (predictor > 65535)
        output[j++] = 65535;
    else if (predictor < -65536)
        output[j++] = -65536;
    else
        output[j++] = (short) predictor;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解码ima4音频格式 的相关文章

  • 在 iPhone 中使用 Soap Web 服务与 wsdl2objc?

    我确实意识到这是一个重复的问题 但是唯一的其他问题已经很老了 所以我想知道是否有人最近有过使用最新版本的经验wsdl2objc http code google com p wsdl2objc 我正在编写一个应用程序 该应用程序将与第三方应
  • 在 iOS 中获取 Facebook 好友时出错

    我正在尝试获取登录用户的 Facebook 好友列表 它在我的帐户中工作正常 但是当我将应用程序详细信息迁移到新帐户并更改应用程序 ID 和应用程序密码时 我收到以下错误 Error Domain com facebook sdk Code
  • 可以使用两个独立的 SQLite 数据库吗?

    我有一个 sqlite 数据库 其中存储用户定义的信息和用户只读的信息 我觉得将来可能需要修改只读信息 并且我不想进行整个数据迁移 有没有一种方法可以使用单独的 sqlite 数据库来存储只读信息 该数据库可以轻松替换 如果是这样 您能否就
  • 如何制作全局数组?

    所以 我读了这个帖子 https stackoverflow com questions 1249131 declaring global variables in iphone project 这几乎正是我正在寻找的东西 然而 这不起作用
  • iPad 上的 ios11 iphone 应用程序图标丢失

    我有一个仅限 iPhone 的应用程序 但它也可以在 iPad 上以兼容模式运行 毫不奇怪 但是当我更新了ios11的应用程序后 iPad上的应用程序图标丢失了 这是我尝试过的 在iPhone模拟器上启动 出现图标 在 iPad 模拟器上启
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • phonegap 插件,用于从库中选择视频

    我需要能够从库中选择视频并将其上传到我的服务器 我可以录制新视频 captureVideo 并上传 文件传输 没问题 但我似乎找不到任何方法来打开视频库并选择视频然后上传 有什么办法可以做到这一点吗 以某种方式更改 MediaType na
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是
  • UITextInputMode currentInputMode 已弃用。建议更换?

    在我们的应用程序中 我们想检测当前的键盘语言 例如 如果用户在 设置 gt 常规 gt 键盘 gt 键盘 下设置了多种语言键盘 我们想知道他们正在输入什么语言 并在发生变化时从 NSNotificationCenter 收到通知 void
  • 从 iPhone 设备查找当前国家/地区

    我必须在 iPhone 设置中获取当前国家 地区 谁能告诉我如何在 iPhone 应用程序中获取当前国家 地区 我必须使用当前国家 地区来解析需要传递当前国家 地区的 RSS 提要 请帮我找到那个国家 提前致谢 要查找用户选择的语言所在的国
  • 苹果游戏中心 API

    我无法找到包含 Game Center Reference 的 GameKit api Apple Game Center 是 iOS 上的一个新社交网络平台 其描述如下 iOS4 中的新增功能 1 GameKit iOS 参考在这里 ht
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • UIView 和 UITableView 中的 UITapGestureRecognizer 冲突

    我有一个UIView我在其中添加了一个UITapGestureRecognizer 在该视图中 我还有一个子视图 其中基本上是某种UITableView 问题是为什么不UITableView识别连续点击 而是始终转到点击手势识别器的处理程序
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • iPhone SDK:将 UIActivityIndi​​catorView 添加到 UITableViewCell

    为什么单元格在这段代码中没有显示任何内容 UIActivityIndicatorView spinner UIActivityIndicatorView alloc initWithActivityIndicatorStyle UIActi
  • 以编程方式检测应用程序是否正在设备或模拟器上运行

    我想知道我的应用程序在运行时是在设备还是模拟器上运行 有没有办法检测到这一点 原因是用模拟器测试蓝牙 api http volcore limbicsoft com 2009 09 iphone os 31 gamekit pt 1 woo
  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑

随机推荐

  • JavaScript 中的文件切片会导致空 blob

    我正在实现一个基于浏览器的分块文件上传器 打开我正在使用的文件
  • Git 重置所有具有特定扩展名的文件

    我对多种类型的文件进行了更改 例如 tsx scss and scss d ts 并已提交并推送到我的分支 有什么办法可以只重置扩展名 scss d ts与主人 保留更改 tsx and scss仅重置 scss d ts与主人 Thank
  • 停止 Thrift 服务器(TSimpleServer)

    我有一个 Thrift 服务器的简单用例 TSimpleServer 其中我生成了几个线程 除了主线程之外 新生成的线程之一进入 Thrift 事件循环 即server serve 在主线程中收到信号后 我调用server stop 这导致
  • 需要将我的基于 HTML5 的 Web 应用程序转换为面向所有移动设备的移动应用程序

    是否可以将我现有的 HTML jquery js 网站转换为针对所有设备 iPhone Android 黑莓等 的移动应用程序 以下是我能想到的几点 如果我错了 请纠正我 添加 jquerymobile js 并更改 css 样式 基于访问
  • 让控制器发回不带 Content-Type 标头的响应

    我在控制器内设置了一个 Rails 3 代理方法 以使用 Nginx 的 X Accel Redirect 在允许用户的情况下从远程服务器传递特定的 URI 不幸的是 Rails 总是发送某种 Content Type 标头 该标头优先于从
  • 自动替换wpf RichTextBox中的文本

    我有一个 WPF NET 4 C RichTextBox我想用其他字符替换该文本框中的某些字符 这将发生在KeyUp event 我想要实现的目标是将首字母缩略词替换为完整单词 例如 pc 个人电脑sc 星际争霸 etc 我查看了一些类似的
  • 转义注释标签内的 html

    转义 html 没问题 它会删除 lt s and gt s etc 我遇到了一个问题 我在注释标签内输出文件名 例如 当然 如果你不逃避 事情可能会很糟糕 所以它变成了 问题是 如果文件名称中包含 则所有 html 都会被搞砸 因为不允许
  • didMove(查看: SKView) 和 didMoveToView(查看: SKView) 有什么区别?

    如标题所示 didMove to view SKView 和 didMoveToView view SKView 有什么区别 我知道 didMoveToView 是方法 并且该视图在旧 版本中属于 SKView 类型 我不明白将 查看 SK
  • iPad iPhone 规模背景图片

    只是想知道是否有其他人经历过 iPad iPhone 缩小背景图像以适应视口的情况 就我而言 我通过 JavaScript 交换背景图像 新的背景图像超宽 适合大型显示器 然而 iPad 正在缩小通过 javascript 添加到 DOM
  • 使用 CSS 剪辑/裁剪背景图像

    我有这个 HTML div lorem ipsum div 使用这个CSS graphic background image url image jpg width 200px height 100px 我应用的背景图像是 200x100
  • 有没有办法在flutter中从iOS中排除包?

    我正在使用仅适用于 Android 的 sms maintained 包 然而 该项目需要一个iOS版本 我目前正在做的是在开发iOS时删除该包 如何将包保留在 pubspec yaml 文件中 但禁止 iOS 检入该包 目标是拥有统一的代
  • PHP 中的 \x00 、 \x04 是什么意思

    我有一些代码有 x00 and x04 十六进制代码 这是什么意思 str implode x00 var message line 1 id var message x04 id line 2 将会发生什么线路 1 和线路 2我想将这些写
  • 为什么数组是协变的,而泛型是不变的?

    来自 Joshua Bloch 的 Effective Java 数组与泛型类型有两个重要的不同之处 第一个数组是协变的 泛型是不变的 协变仅仅意味着如果 X 是 Y 的子类型 那么 X 也将是 Y 的子类型 数组是协变的 因为字符串是对象
  • 根据行逐步对 Numpy Python 矩阵进行排序

    我四处寻找并试图找到解决这个看似简单问题的方法 但一无所获 问题是根据矩阵的列逐步对矩阵进行排序 所以 如果我有一个像这样的 numpy 矩阵 import numpy as np X np matrix 0 0 1 2 0 0 1 1 0
  • 是否可以使 eclipse p2 配置机制在*本地*运行?

    Eclipse 3 4 x 也称为Ganymede http www eclipse org downloads packages 附带了一种新的配置机制 称为p2 配置 是允许按需发现和更新应用程序的某些部分的过程 正如本文中关于太阳网站
  • System.Security.SecurityException:主体权限请求失败

    任何人都可以帮助我指出如何修复此错误的正确方向吗 System Web Services Protocols SoapException Server was unable to process request gt System Secu
  • 获取kivy中选定复选框的值

    test py import sqlite3 as lite from kivy uix screenmanager import Screen from kivy app import App from kivy lang import
  • Rsync 仅创建符号链接

    我目前 rsync 运行良好 它将我的所有文件从一个目录复制到另一个目录 唯一的事情是它是物理复制文件 我有很多大文件 我不想拥有所有文件的副本 我只想在新目录中创建一个符号链接 以便我可以在网页上提供数据 源目录中有一些我不希望公众看到的
  • 如何识别和删除换行符和空格?

    我正在通过按组件分隔字符串来创建一个 nsmutable 数组 这会导致在数组中插入大量换行符和空格 如何识别和删除它们 for int i 0 i
  • 解码ima4音频格式

    为了减少 iPhone 应用程序的下载大小 我压缩了一些音频文件 具体来说 我在命令行上使用 afconvert 将 wav 格式更改为 caf 格式 带 ima4 压缩 我读了this http www wooji juice com b