在呼叫持续期间,如果通话中的一方使用电话保持功能,会触发re-invite,由于某种原因,re-invite协商的结果,可能会和初始INVITE的协商结果不同。但是,在大部分场合里,我们是希望整个通话过程中,codec不要变化的。有没有什么解决办法呢?
为了达成目的,我们可以在同一context下添加一个extension:
<extension name="lock_codec">
<condition field="destination_number" expression="^lock_codec$">
<action application="set" data="absolute_codec_string=${rtp_use_codec_name}"/>
</condition>
</extension>
然后,在你的拨号方案中,处理bridge之前的合适位置,加上这么一行:
<action application="set" data="execute_on_answer=execute_extension lock_codec XML default"/>
这样,当channel被answer时,会执行“lock_codec"这个extension,设置absolute_codec_string为第一次协商的结果,它将影响后续re-invite的协商。
当然,你可以用"export"代替"set",或者通过{}语法,让这个变量同时作用于A-leg和B-leg。