我在我的 VOIP 应用程序中使用了 G729 编解码器,当应用程序仅针对 armv7 时,它工作正常。被叫方可以清楚地听到我的声音。然后我转向arm64,被叫方不再清楚我的声音。我在 Caller 端的 armv7 设备和 arm64 设备上记录 G729 编解码器前后输入的语音原始数据,然后将 G729 编码数据转换回来。我发现从 armv7 设备转换回来的声音比 arm64 设备好得多。
问问题
598 次
1 回答
5
这取决于您使用的 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
是1ffffff
( 33554431
) 在 32 位上,但是ffffffff01ffffff
( -4261412865
) 在 64 位上,因为在 ARM 处理器上的 64 位上 long 要大得多(我正在使用 iPhone 4、armv7、32 位和 iPhone 5s、arm64 进行测试, 64 位)。
所以基本上在 64 位上,比较总是无法通过检查,因为第二项总是负数,而 aUWord32
总是正数。
我的解决方案是在 32 位上使用硬编码的减法结果,因此使用0x3ffffffL
第一个条件和0x1ffffffL
第二个,为我解决了语音质量问题:
lpc.c:643 if ((UWord32)(t0 - 0xff000000L) < 0x3ffffffL)
lpc.c:698 if ((UWord32)(t0 - 0xfe000000L) < 0x1ffffffL)
希望这可以帮助。
于 2015-07-22T16:29:27.513 回答