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

最佳答案

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

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 ),但在 64 位上是 ffffffff01ffffff ( -4261412865 ),因为在 ARM 处理器上的 64 位上的 long 大得多(我正在使用 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/

10-10 18:35