ios - 为 iOS arm64 编译的 G729 编解码器无法正常运行

标签 ios arm64 g729

我在我的 VOIP 应用程序中使用了 G729 编解码器,当该应用程序仅针对 armv7 时,它工作正常。被叫方可以清楚地听到我的声音。然后我转向arm64,被叫方再也听不清我的声音了。我在Caller端的armv7设备和arm64设备上都记录了G729编解码前后输入的语音原始数据,然后将G729编码的数据转换回来。我发现从 armv7 设备转换后的语音比 arm64 设备好得多。

最佳答案

这取决于您使用的 G729 实现,但如果您使用的是 Samuel Vinson 的,我相信我发现了问题。

lpc.c 中,第 643 行和第 698 行分别有一个结果之间的比较和两个值之间的减法:

lpc.c:643  if ((UWord32)(t0 - 0xfe000000L) < 0x01ffffffL -  0xfe000000L)
lpc.c:698  if ((UWord32)(t0 - 0xff000000L) < 0x00ffffffL -  0xff000000L)

0x00ffffffL - 0xff000000L 的结果在 32 位上是 1ffffff (33554431),但是 ffffffff01ffffff (-4261412865) 在 64 位上,因为 long 在 ARM 处理器上的 64 位上要大得多(我正在测试 iPhone 4,armv7,32 位和 iPhone 5s,arm64,64 位)。

所以基本上在 64 位上,比较总是会失败,因为第二项总是负数,而 UWord32 总是正数。

我的解决方案是在 32 位上使用减法的硬编码结果,所以 使用 0x3ffffffL 作为第一个条件,使用 0x1ffffffL 作为第二个条件,为我解决了语音质量问题:

lpc.c:643  if ((UWord32)(t0 - 0xff000000L) < 0x3ffffffL)
lpc.c:698  if ((UWord32)(t0 - 0xfe000000L) < 0x1ffffffL)

希望这对您有所帮助。

关于ios - 为 iOS arm64 编译的 G729 编解码器无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117940/

相关文章:

PHP如何检测是否运行在arm64 cpu上?

c++ - 使用 FFmpeg API 加载 G.729 解码器时出现问题

ios - Xcode Storyboard屏幕类型影响模拟器内的布局

ios - UICollectionView 的 UILabel 中的奇怪文本问题

assembly - aarch64 中的零寄存器 0x​​104567910 本质上是接地的吗?

android - 为 fopen 更改 Android 中文件的权限

java - 如何在Java中将g729编码的字节数组转换为.wav pcm_alaw?

ios - 带有自定义单元格的 UICollectionView 破坏 UICollectionViewDataSource 协议(protocol)

ios - 如何将带有字符串的自定义日期格式写入其中?