SIP协议之音/视频转换

news/2024/12/23 2:27:07/

  在SIP通话应用场景中,有时需要在音频和视频通话中进行切换,这个功能实现的需要发送re-INVITE重新协商媒体,即重新协商媒体(SDP)中是否允许视频。

一、实现原理

1.1 音频转视频

  音频通话过程中,发起方重新发送INVITE消息,SDP媒体参数中在原有音频参数的基础上增加视频参数,接受方如果支持视频,则在响应的200-OK消息中带上协商的视频参数,然后两端开始收发视频流

1.2 视频转音频

  音频通话过程中,发起方重新发送INVITE消息,SDP媒体参数中移除原有的视频参数,接受方则在响应的200-OK消息中只保留音频参数或禁止视频,然后两端停止收发视频流

二、报文交互

2.1 音频转视频

信令交互:
在这里插入图片描述

INVITE消息:
INVITE sip:1002@192.168.1.248:5060;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.74:5060;rport;branch=z9hG4bKPjAvimPJxyyYQjxnsp1Py6cvUF4wU-M9LZ
Max-Forwards: 70
From: “1001” sip:1001@192.168.1.248;tag=bUW2K4dpkGZGInsDmLyey16kd4naQzzA
To: sip:1002@192.168.1.248;tag=r9X9UXUNKU1rj
Contact: “1001” sip:1001@192.168.1.74:5060
Call-ID: kpf4FQxDfU6FS77XB.VRIwmHS4fH56T1
CSeq: 3806 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel
User-Agent: VoIP
Content-Type: application/sdp
Content-Length: 666

v=0
o=- 3900455088 3900455090 IN IP4 192.168.1.74
s=SDP
c=IN IP4 192.168.1.74
b=AS:3166
t=0 0
m=audio 10008 RTP/AVP 0 8 9 18 102 97 101
c=IN IP4 192.168.1.74
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:102 opus/48000
a=fmtp:102 maxplaybackrate=16000;sprop-maxcapturerate=16000;maxcodedaudiobandwidth=16000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=20
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
m=video 10010 RTP/AVP 99
c=IN IP4 192.168.1.74
b=TIAS:3000000
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42801e;max-br=3000;packetization-mode=1
a=sendrecv

200-OK:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.74:5060;rport=5060;branch=z9hG4bKPjAvimPJxyyYQjxnsp1Py6cvUF4wU-M9LZ
From: “1001” sip:1001@192.168.1.248;tag=bUW2K4dpkGZGInsDmLyey16kd4naQzzA
To: sip:1002@192.168.1.248;tag=r9X9UXUNKU1rj
Call-ID: kpf4FQxDfU6FS77XB.VRIwmHS4fH56T1
CSeq: 3806 INVITE
Contact: sip:1002@192.168.1.248:5060;transport=udp
User-Agent: FreeSWITCH-mod_sofia/1.10.10-dev+git20230407T063007Zbe3a73af62~64bit
Accept: application/sdp
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 374

v=0
o=- 3900455104 3900455107 IN IP4 192.168.1.222
s=SDP
c=IN IP4 192.168.1.222
t=0 0
m=audio 10008 RTP/AVP 0 101
c=IN IP4 192.168.1.222
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
m=video 10010 RTP/AVP 99
c=IN IP4 192.168.1.222
b=TIAS:768000
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42801e;max-br=768;packetization-mode=1

2.2 视频转音频

信令交互:
在这里插入图片描述

INVITE消息:
INVITE sip:1002@192.168.1.248:5060;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.74:5060;rport;branch=z9hG4bKPjp0vl88Onf20ksGJhJa.YPMabZxhe90sZ
Max-Forwards: 70
From: “1001” sip:1001@192.168.1.248;tag=bUW2K4dpkGZGInsDmLyey16kd4naQzzA
To: sip:1002@192.168.1.248;tag=r9X9UXUNKU1rj
Contact: “1001” sip:1001@192.168.1.74:5060
Call-ID: kpf4FQxDfU6FS77XB.VRIwmHS4fH56T1
CSeq: 3809 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel
User-Agent: VoIP
Content-Type: application/sdp
Content-Length: 662

v=0
o=- 3900455088 3900455092 IN IP4 192.168.1.74
s=SDP
c=IN IP4 192.168.1.74
b=AS:3166
t=0 0
m=audio 10008 RTP/AVP 0 8 9 18 102 97 101
c=IN IP4 192.168.1.74
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:102 opus/48000
a=fmtp:102 maxplaybackrate=16000;sprop-maxcapturerate=16000;maxcodedaudiobandwidth=16000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=20
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
m=video 0 RTP/AVP 99 //视频接收端口为0
c=IN IP4 192.168.1.74
b=TIAS:3000000
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42801e;max-br=3000;packetization-mode=1
a=sendrecv

200-OK消息:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.74:5060;rport=5060;branch=z9hG4bKPjp0vl88Onf20ksGJhJa.YPMabZxhe90sZ
From: “1001” sip:1001@192.168.1.248;tag=bUW2K4dpkGZGInsDmLyey16kd4naQzzA
To: sip:1002@192.168.1.248;tag=r9X9UXUNKU1rj
Call-ID: kpf4FQxDfU6FS77XB.VRIwmHS4fH56T1
CSeq: 3809 INVITE
Contact: sip:1002@192.168.1.248:5060;transport=udp
User-Agent: FreeSWITCH-mod_sofia/1.10.10-dev+git20230407T063007Zbe3a73af62~64bit
Accept: application/sdp
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 240

v=0
o=- 3900455104 3900455108 IN IP4 192.168.1.222
s=SDP
c=IN IP4 192.168.1.222
t=0 0
m=audio 10008 RTP/AVP 0 101
c=IN IP4 192.168.1.222
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
m=video 0 RTP/AVP 19 //视频接收端口为0

三、关键说明

  • 转视频信令实现方式有以下几种:

  1. 将视频的接收端口置为0的方式
  2. 将视频的媒体属性设置为inactive

 m=video 10086 RTP/AVP 99c=IN IP4 192.168.1.74b=TIAS:3000000a=rtpmap:99 H264/90000a=fmtp:99 profile-level-id=42801e;max-br=3000;packetization-mode=1a=inactive

  3. 将视频的媒体接收地址置为0.0.0.0

 m=video 10086 RTP/AVP 99c=IN IP4 0.0.0.0b=TIAS:3000000a=rtpmap:99 H264/90000a=fmtp:99 profile-level-id=42801e;max-br=3000;packetization-mode=1a=inactive

   4. 去除视频参数,只保留音频参数

  • 不同的服务器实现方式可能不同

http://www.ppmy.cn/news/1015433.html

相关文章

【容器化】Oceanbase镜像构建及使用

通过该篇文章可以在国产X86-64或ARM架构上构建商业版oceanbase,只需要替换pkg安装包即可。下面截图主要以国产X86-64安装为例,作为操作截图: 镜像构建目录说明 pkg:用来存放安装包及脚本,抛出rpm其他是脚步,这些rpm包可以下载不同系统架构的包,构建镜像时该目录只需要保…

【LeetCode 热题 100】图论 专题(bfs,拓扑排序,Trie树 字典树)

from: https://leetcode.cn/studyplan/top-100-liked/ bfs 具有 边权为1 的最短路性质 拓扑排序,入度 Trie树, 高效存储 字符串【见鬼,不知道为什么写错,需要掌握熟练度】 文章目录 200. 岛屿数量【dfs / bfs】994. 腐…

【GPT-3 】创建能写博客的AI工具

一、说明 如何使用OpenAI API,GPT-3和Python创建AI博客写作工具。 在本教程中,我们将从 OpenAI API 中断的地方继续,并创建我们自己的 AI 版权工具,我们可以使用它使用 GPT-3 人工智能 (AI) API 创建独特的…

VirtualEnv 20.24.0 发布

导读VirtualEnv 20.24.0 现已发布,VirtualEnv 用于在一台机器上创建多个独立的 Python 运行环境,可隔离项目之间的第三方包依赖,为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不需要在服务器上再折腾一…

BL302嵌入式ARM控制器:高性能处理器驱动的储能优化利器

嵌入式ARM控制器钡铼技术BL302系列是工业级坚固型工业控制器,采用NXP的高性能处理器I.MX6ULL,搭配先进的ARM Cortex-A7构架,运行速度高达800MHz,具有高度的稳定性。本产品最高可提供4路RS485/RS232,1路CAN口&#xff0…

一篇文章看懂Apipost Mock功能怎么用

在接口开发过程中,Mock功能可以帮助开发者快速测试和验证接口的正确性和稳定性,以便快速迭代和修复问题。Apipost推出智能Mock功能,可以在智能期望中填写一些触发条件,开启后,Apipost会根据已设置的触发条件&#xff0…

力扣279.完全平方数(动态规划)

class Solution { public:int numSquares(int n) {vector<int> f(n 1);for (int i 1; i < n; i) {int minn INT_MAX;for (int j 1; j * j < i; j) {minn min(minn, f[i - j * j]); //上一次的 & 当前数可以找到一个新的更大的平方}f[i] minn 1; }…

apt、aptitude、apt-get/apt-cache语法的区别

apt句法 aptitude句法 apt-get/apt-cache语法 描述 apt update aptitude update apt-get update 更新包存档元数据 apt install foo ap