我在VOIP应用程序中使用了G729编解码器,当该应用程序仅针对armv7时,它可以正常工作。被叫者可以清楚地听到我的声音。然后我转向arm64,被叫者不再能清楚地听到我的声音。我在输入方的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
是1ffffff
(33554431
)在32位上,而ffffffff01ffffff
(-4261412865
)在64位上,因为在ARM处理器上,long在64位上更大(我正在用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)
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句