应一网友要求,用fs实现一个这样的功能:在sipml5看到他的一个设备(下面简称为device),后者支持H264,但不支持VP8,现象是:
- pjsip bridge device,音视频正常
- sipml5 bridge device,音频正常,sipml5看到黑屏,但uuid_debug_media <uuid> vboth on,正常
- sipml5 bridge pjsip,音视频正常
- sipml5 echo, 音视频正常
这是典型的互联互通问题,到底什么原因呢?百思不得解!最大的困难在于webrtc的媒体是加密的,不容易抓包分析。
突然想到能不能这样做呢:
sipml5 ---VP8----fs
fs----H264---device
用下面的dialplan试了试:
<action application="set" data="absolute_codec_string=PCMA,VP8"/>
<action application="bridge" data="[absolute_codec_string=PCMA\,H264]user/${destination_number}"/>
还真的不错,sipml5马上看到device的视频了。
dialplan要考虑nat,考虑是否视频呼叫等,最后的版本如下:
<extension name="check_video" continue="true" >
<condition>
<action application="info" data=""/>
<action application="set" data="is_video=${regex(${switch_r_sdp}|m=video)}" inline="true"/>
<action application="log" data="ERR is_video = ${is_video}"/>
<action application="set" data="is_vp8=${regex(${switch_r_sdp}|VP8)}" inline="true"/>
<action application="log" data="ERR is_vp8 = ${is_vp8}"/>
<condition field="${is_vp8}" expression="true">
<action application="log" data="ERR dialplan here"/>
<action application="set" data="absolute_codec_string=PCMA,VP8"/>
</condition>
</condition>
</extension>
<extension name="Local_Extension">
<condition field="destination_number" expression="^(10[01][0-9])$">
<condition field="${is_video}" expression="true">
<action application="set" data="sip_sticky_contact=true"/>
<action application="bridge" data="[absolute_codec_string=PCMA\,H264]user/${destination_number}"/>
<anti-action application="set" data="sip_sticky_contact=true"/>
<anti-action application="bridge" data="[absolute_codec_string=PCMA]user/${destination_number}"/>
</condition>
</condition>
</extension>
其中check_video检查是否有video,如果有video再检查是否有VP8编码,如果有VP8,那么设置编码为PCMA和VP8。
Local_Extension是呼叫本地分机,device回200 OK,带的contact不可达,需要设置sip_sticky_contact,这样fs就会rewrite contact。