SIP协议之音/视频转换

  在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.mfbz.cn/a/66568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【力扣每日一题】2023.8.6 两两交换链表中的节点

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个链表,让我们两两交换相邻节点的值,并且不能通过修改节点内部的值来达到这一目的,如果可…

【计算机视觉 | Kaggle】飞机凝结轨迹识别 Baseline 分享和解读(含源代码)

文章目录 一、导读二、比赛背景三、比赛任务四、比赛数据五、评价指标六、Baseline6.1 Training part6.2 Submission part 一、导读 比赛名称:Google Research - Identify Contrails to Reduce Global Warming https://www.kaggle.com/competitions/google-researc…

Meta开源AI音频和音乐生成模型

在过去的几年里,我们看到了AI在图像、视频和文本生成方面的巨大进步。然而,音频生成领域的进展却相对滞后。MetaAI这次再为开源贡献重磅产品:AudioCraft,一个支持多个音频生成模型的音频生成开发框架。 AudioCraft开源地址 开源地…

使用Flask框架mock server实战(三)

1、demo1:登录接口 1.1 Flask代码 from flask import request, Flask, jsonify# 创建1个实例 app Flask(__name__)# 解决接收中文报文乱码问题 app.config[JSON_AS_ASCII] False# 登录接口 # 指定路由和请求方法。strict_slashesFalse 对URL最后的/符合是否严格…

QT生成可执行文件的步骤

QT生成可执行文件的步骤 第一步:debug为release,然后进行编译 第二步:添加QT生成必要的库 首先,建立一个新的文件夹,然后将Release中的可执行文件拷贝到新的文件夹中 然后,在新建文件夹中生成必要的库 …

设计模式---工厂模式

1.什么是设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 …

Leetcode-每日一题【剑指 Offer 18. 删除链表的节点】

题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调…

Vue2:组件高级(下)

Vue2:组件高级(下) Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 目标: 自定义指令 基础概念: 概念: 内置指令:vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。…

Python练习 linux系统资源监控

yum install python3 yum -y install python3-pip yum -y install epel-release yum -y install gcc python-devel pip install --trusted-host pypi.tuna.tsinghua.edu.cn psutil 初版: import os import sys import time import platform import subprocess …

day10 快速排序 方法重载 和 方法递推

方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单,类似二…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参…

python制作小程序制作流程,用python编写一个小程序

这篇文章主要介绍了python制作小程序代码宠物运输,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 d…

第二季“数字强市建设体验团”活动感悟-张继群

目录 第二季“数字强市建设体验团”活动感悟-张继群 第二季“数字强市建设体验团”活动感悟-张继群 此次参观中山东安信木业、费县智慧城市运营中心、澳柯玛以及沂南双创科技园区给我留下深刻印象,我深深地感受到了现代科技与生活的紧密联系。我们临沂市智慧大数据…

在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

1.配置工作环境 sudo apt install gcc bison flex libncurses-dev ninja-build \pkg-config build-essential zlib1g-dev pkg-config libglib2.0-dev \binutils-dev libboost-all-dev autoconf libtool libssl-dev \libpixman-1-dev python-capstone virtualenv software-prop…

selenium获取b站视频标题

一、下载selenium 1. 下载对应版本的浏览器驱动 2. 安装selenium 3.把浏览器驱动放到使用的python内核的script目录中 二、测试效果模拟登录b站 from selenium import webdriver from selenium.webdriver.common.by import By import timebrowser webdriver.Chrome() # 打…

设计模式之Bridge模式的C++实现

目录 1、Bridge模式的提出 2、Bridge模式的定义 3、Bridge模式总结 4、需求描述 5、多继承方式实现 6、使用Bridge设计模式实现 1、Bridge模式的提出 在软件功能模块设计中,如果类的实现功能划分不清晰,使得继承得到的子类往往是随着需求的变化&am…

Win10语言设置 - 显示语言和应用语言

前言 Win10的语言设置可以设置显示语言和应用语言。其中,显示语言用于显示系统文字;应用语言用于应用程序显示文字。下文介绍如何设置。 显示语言 打开系统设置,选择时间和语言,如下图: 修改Windows显示语言即可更…

搭建Django+pyhon+vue自动化测试平台

Django安装 使用管理员身份运行pycharm使用local 1 pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 检查django是否安装成功 1 python -m django --version 创建项目 1 1 django-admin startproject test cd 切换至创建的项目中启动django项目…

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep? grep实例演示 命令参数: 案例演示: sed 概念: 常用选项: 案例演示: awk 概念: awk常用命令选项: awk变量: 内置变量 自定义变量 a…

Java课题笔记~ JavaWeb概述/开发基础

JavaWeb概述/开发基础 1.XML基础 (1)XML概述 (2)XML语法 (3)DTD约束 (4)Schema约束(XML Schema 比 DTD 更强大) 2.Web基础知识 Web是一个分布式的超媒…