1. FreeSWITCH视频媒体流转发问题分析与修复
作为一名在VoIP领域工作多年的工程师,我最近在FreeSWITCH的proxy_media模式下遇到了一个棘手的视频流转发问题。这个问题看似简单,但排查过程却让我对FreeSWITCH的媒体处理机制有了更深入的理解。下面我将详细记录这个问题的发现、分析和解决过程,希望能帮助遇到类似问题的同行。
1.1 问题背景与环境配置
我使用的测试环境是:
- 操作系统:CentOS 7.9
- FreeSWITCH版本:1.6.20
- 网络环境:局域网测试环境,延迟<5ms
测试场景是通过FreeSWITCH建立两路通话(A路和B路),在proxy_media模式下转发音视频媒体流。proxy_media是FreeSWITCH的一个重要特性,它允许FreeSWITCH不直接处理媒体流,而是让两个终端直接交换媒体数据,从而减轻服务器负担。
1.2 问题现象描述
在测试过程中,我发现当A路呼叫包含音频和视频媒体信息时,B路的视频流转发出现了异常。具体表现为:
-
A路远端发送的SDP中包含音频和视频信息:
code复制m=audio 16394 RTP/AVP 8 18 101 m=video 16396 RTP/AVP 99 -
FreeSWITCH处理后,发起B路呼叫,B路的本地SDP继承了A路的SDP:
code复制m=audio 54398 RTP/AVP 8 18 101 m=video 54400 RTP/AVP 99 -
当B路终端返回183 SDP响应后,FreeSWITCH处理媒体信息,本地SDP被修改为:
code复制m=audio 54398 RTP/AVP 8 18 101 m=video 44622 RTP/AVP 99
问题的关键在于:B路本端的视频流从44622端口发送到远端,而远端的视频流却发送到本地的54400端口,导致媒体流"擦肩而过",无法正常通信。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与定位
2.1 代码层面分析
通过分析FreeSWITCH源代码,我定位到问题出在switch_core_media.c文件的switch_core_media_patch_
