SIP协议之音/视频转换

news2024/10/7 18:30:14

  在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 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=inactive

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/851214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作

python版《羊了个羊》游戏开发第一天

Python小型项目实战教学课《羊了个羊》 一、项目开发大纲(初级) 版本1.0:基本开发 课次 内容 技术 第一天 基本游戏地图数据 面向过程 第二天 鼠标点击和移动 面向对象 第三天 消除 设计模式:单例模式 第四天 完整…

换架 3D 飞机,继续飞呀飞

相信大多数图扑 HT 用户都曾见过这个飞机的 Demo,在图扑发展的这十年,这个 Demo 是许多学习 HT 用户一定会参考的经典 Demo 之一。 这个 Demo 用简洁的代码生动地展示了 OBJ 模型加载、数据绑定、动画和漫游等功能的实现。许多用户参考这个简单的 Demo 后…

算法练习--leetcode 链表

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入&…

【IMX6ULL驱动开发学习】03.Linux驱动开发之GPIO子系统、中断、定时器

一、GPIO子系统 1.1 引脚编号 在硬件上如何确定GPIO引脚?它属于哪组GPIO?它是这组GPIO里的哪个引脚?需要2个参数。但是在Linux软件上,可以使用引脚编号来表示。以100ask_ imx6ull为例在开发板上执行如下命令查看已经在使用的GPI…

桥接模式-java实现

桥接模式 桥接模式的本质,是解决一个基类,存在多个扩展维度的的问题。 比如一个图形基类,从颜色方面扩展和从形状上扩展,我们都需要这两个维度进行扩展,这就意味着,我们需要创建一个图形子类的同时&#x…

手搓vue3组件_1.封装一个button

我的icepro参考地址,内有参考代码,有条件的割割点点star 实现要求: 基于vue3支持通过colors(更改颜色)支持点击事件…支持其他的自定义样式(例如圆角,size等等) 最基础的第一步: 父组件引入并使用: <template><div class"buttonLim">我的按钮:<ice-b…

Zabbix监控华为交换机DHCP接口地址池

一、背景 最近工作中遇到一个因为DHCP地址池满载、导致用户无法获取到IP地址的故障&#xff0c;所以在想通过zabbix 监控DHCP地址池的状态、当DHCP 地址池数量小于某个值时触发zabbix告警。 网上找了一下没有相关的文档、和对应的OID值、于是用Python 脚本的方式实现 二、实现效…

第二课-一键安装SD-Stable Diffusion 教程

前言 看完这篇文章并跟着操作,就可以在本地开始 SD 绘图了。 理论上来说,这篇课程结束,想要画什么图都可以画了。 启动器介绍 SD 是开源的,可以在 github 上找到。但直接下载源码安装,非常费劲,而且因为国内外差异,就是我这样的秃头程序员也难以应对。 所以,我们改…

Spring中Bean的“一生”(生命周期)

文章目录 一、图解二、文字解析总结 一、图解 >注&#xff1a;处于同一行的执行顺序是从左往右 二、文字解析 SpringBean的生命周期总体分为四个阶段&#xff1a;实例化>属性注入>初始化>销毁 Step1 实例化Bean&#xff1a;根据配置文件中Bean的定义&#xff0c;…

设计模式(3)装饰模式

一、介绍&#xff1a; 1、应用场景&#xff1a;把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更加灵活。 当需要给一个现有类添加附加职责&#xff0c;而又不能采用生成子类的方法…

[RCTF2019]DontEatMe

前言 一道迷宫题&#xff0c;但是输入被加密后使用&#xff0c;迷宫也需要在程序中找出并没有直接输出 分析 反调试 发现有两个比较特殊的地方&#xff0c;随机数和创建了新线程&#xff0c;随机数后面又被重新赋值给覆盖了&#xff0c;暂时不用管&#xff0c;ZwSetInformat…

业务需求紧急,IT部门缺失,企业如何应对"影子IT"危机?

在当今数字化时代&#xff0c;业务部门的需求通常非常紧急&#xff0c;但IT部门的排期却跟不上&#xff0c;导致业务部门焦头烂额。IT部门面临着诸多需求&#xff0c;无法在规定时间范围内满足每一个需求&#xff0c;因此未授权的应用程序安全监管也变得愈发困难。 影子IT的频发…

互联网电影购票选座后台管理系统源码开发

搭建一个互联网电影购票选座后台管理系统需要进行以下步骤&#xff1a; 1. 需求分析&#xff1a;首先要明确系统的功能和需求&#xff0c;包括电影列表管理、场次管理、座位管理、订单管理等。 2. 技术选型&#xff1a;选择适合的技术栈进行开发&#xff0c;包括后端开发语言…

铸铝齿轮泵比例流量阀放大器

液压齿轮泵是一种常用的液压泵&#xff0c;被广泛应用于各种低压系统中&#xff0c;如采矿、冶金、建筑、航空、航海、农林等机械的中、高压液压系统中。 液压齿轮泵的特点是结构简单&#xff0c;制造方便&#xff0c;价格低廉&#xff0c;体积小&#xff0c;重量轻&#xff0…

探析STM32标准库与HAL库之间的差异与优劣

引言&#xff1a; 在嵌入式开发领域&#xff0c;STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库&#xff0c;即标准库和HAL库&#xff0c;用于开发各种应用。本文将探讨这两种库之间的差异&#xff0c;比较它们的优劣&#xff0c;并分析在选择库时需…

[HDLBits] Exams/m2014 q4e

Implement the following circuit: module top_module (input in1,input in2,output out);assign out!(in1||in2); endmodule

【MySQL】

这里写目录标题 MySQL架构一条sql执行流程MySQL数据存放电脑位置ibd文件结构行溢出是什么MySQL行记录存储格式索引为什么InnoDB选择B树作为索引数据结构什么时候需要创建索引优化索引方法InnoDB内部怎么存储数据B 树如何进行查询聚簇索引和二级索引为什么MySQL要采用B树作为索引…

【linux】ssh 和adb connect区别

问&#xff1a;ssh 与ping的区别 答&#xff1a;SSH&#xff08;Secure Shell&#xff09;和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议&#xff0c;用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式&#xff0c;可以在不安全的网络上进行远程登…

无涯教程-Perl - fileno函数

描述 此函数返回指定的FILEHANDLE的文件描述符号(由C和POSIX函数使用)。通常,这仅在使用select函数和任何低级tty函数时才有用。 语法 以下是此函数的简单语法- fileno FILEHANDLE返回值 此函数返回FILEHANDLE的文件描述符(数字),失败时不确定。 Perl 中的 fileno函数 - 无…