FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析

SDP在4566 中有详细描述。

SDP 全称是 Session Description Protocol,

翻译过来就是描述会话的协议。

主要用于两个会话实体之间的媒体协商。

什么叫会话呢,比如一次网络电话、一次电话会议、一次视频聊天,这些都可以称之为一次会话。

那为什么要去发这个描述文本呢,主要是为了解决参与会话的各成员之间能力不对等的问题,如果参加本次通话的成员都支持高质量的通话,但是我们没有去进行协议,为了兼容性,使用的都是普通质量的通话格式,这样就很浪费资源了。所以 SDP 的作用还是很有必要的。

SDP(Session Description Protocol) 完全是⼀种会话描述格式 ― 它不属于传输协议 ― 它只使⽤不 同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、 实时流协议(RTSP)、 MIME 扩展协议的电⼦邮件以及超⽂本传输协议(HTTP)。SDP协议是也是基于⽂本的协议,这样就能保 证协议的可扩展性⽐较强,这样就使其具有⼴泛的应⽤范围。SDP 不⽀持会话内容或媒体编码的协商,所 以在流媒体中只⽤来描述媒体信息。媒体协商这⼀块要⽤ RTSP 来实现.

SDP 协议结构 key = value 

key 一般是一个字母,

value 的值由key的啥 对应不同的值

协议中的特殊符号 *

OPTIONAL items are marked with a "*".
在协议中 用 * 表示 是  可选的
如果没有 *,则表示是 必选的

由两大部分组成 或者三大部分组成,原始协议中将会话时间和重复信息划分到 (time description中)

协议部分说明是三大部分

Session description
v= (protocol version)
o= (originator and session identifier)
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information -- not required if included in
all media)
b=* (zero or more bandwidth information lines)
One or more time descriptions ("t=" and "r=" lines; see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attribute lines)
Zero or more media descriptions
Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description, if present
m= (media name and transport address)
i=* (media title)
c=* (connection information -- optional if included at
session level)
b=* (zero or more bandwidth information lines)
k=* (encryption key)
a=* (zero or more media attribute lines)

会话级别信息

协议版本号(v)(必选)

version的缩写

作用:⼀个会话描述的开始,前⼀个会话结束标志。

描述: 表示sdp的版本号,不包含次版本号

        例子:v=0

会话源(o)(必选)

origin的缩写

作用:(会话源或者会话⽣成者,以及会话标识符)

        格式如下
        o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
        
        其中 username、session-id、nettype、addrtype、unicast-address ⼀起,唯⼀标识⼀
个会话
各字段含义如下:
username:发起者的⽤户名,不允许存在空格,如果应⽤不⽀持⽤户名,则为 -
sess-id:会话id,由应⽤⾃⾏定义,规范的建议是NTP(Network Time Protocol)时间戳。
sess-version:会话版本,⽤途由应⽤⾃⾏定义,只要会话数据发⽣变化时(⽐如编码),sess
version随着递增就⾏。同样的,规范的建议是NTP时间戳。
nettype:⽹络类型,⽐如 IN 表示 Internet
addrtype:地址类型,⽐如 IP4 IV6
unicast-address:域名,或者IP地址。
        例子: o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
        

会话名称(s)(必选)

Session Name 的缩写

        (会话名称)这个字段是个⽂本字符串,可以显示给会话参与者。

        s=SDP Seminar

        s=No Name

时间描述(t)(必选)

        (会话时间)这个字段指明会话开始时间与结束时间。
例子
       t=2873397496 2873404696
        t=0 0
  • 描述:t字段描述了会话的开始时间和结束时间, 为 NTP时间,单位是秒;如果 为0表示过了之后,会话一直持续;当 和 都为0的时候,表示持久会话,如拉实时流;

属性(a)(可选)一般都会有值

a=<attribute>
a=<attribute>:<value>
可选字段中,连接信息字段是特别与条件相关的。因为该字段定义了数据应发送到的⽹络地址,所以必须 被包含进会话描述中的某个地⽅。
        例子
                a=tool:libavformat 60.3.100

会话信息(i)(可选)

(会话信息)对字段的⽂本描述,提供了⽐会话名称更多的信息。该字段既可以⽤于会话级也可以⽤ 于媒体级。

例子

i=A Seminar on the session description protocol

URI(u)(可选)

(描述的URI地址)URI信息,通过这个地址可以获取更多会话相关信息。例如,⼀个会议可能公布 在WEB⻚⾯上,所以需要该WEB的URI。每个会话只能提供⼀个URI
例子

u=http://www.example.com/seminars/sdp.pdf

E-mail地址(e)(可选)

E=(E-mail地址)负责会话个体的E-mail地址,可以有多个。只能⽤于会话级别。
例子
e=j.doe@example.com (Jane Doe)

电话号码(p)(可选)

可以有多个,会话级别。
例子:
p=+1 617 555-6011
这里没有查到在国内应该怎么写电话号码,在协议中的例子 有 +,有 -,从例子中可以看到,不止是数字,应该+和-也能用

连接信息(c)(可选)

Connection Data

(连接信息)该字段提供连接数据,包括网络类型、地址类型和连接地址。可应⽤于会话级也可以⽤ 于媒体级
  • network type:网络类型,一般为IN,表示internet;
  • address type:地址类型,一般为IP4;
  • connection address,地址,可能为域名或ip地址两种形式;
在会话级时:   c=IN IP4 224.2.17.12/127
在媒体级时:  

带宽信息(b)(可选)

(带宽信息)指明带宽需求,单位 kbit/s , 可⽤于两个级别
b=<bwtype>:<bandwidth>
  • 描述:该选项描述了建议的带宽,单位 kbs/s,可选,modifier包括两种类型,CT和AS,CT表示总带宽,AS表示单个媒体带宽的最大值;bandwidth表示具体的带宽;

重复信息(r)(可选)

r=(重复次数)如果是有规律的⽇程安排活动,这个字段⽤来指明会话重复频次和时间。
r=<repeat interval> <active duration> <offsets from start-time>
重复间隔
活动持续时间
与开始时间的偏移
r=7d 1h 0 25h
d - days (86400 seconds)
h - hours (3600 seconds)
m - minutes (60 seconds)
s - seconds (allowed for completeness)

时区调整(z)(可选)

(时区调整)⽤于按⽇程安排的有规律活动会话。会话可能会夸时区,避免时区变更造成的混乱。
z=<adjustment time> <offset> <adjustment time> <offset> ....
z=2882844526 -1h 2898848070 0

加密密钥(k)(可选)

(加密密钥)为了对媒体加密、解密,该字段提供了⼀个加密密钥或者规定了⼀个获取密钥的机制。 可⽤于两个级别。
k=<method>
k=<method>:<encryption key>
k=clear:<encryption key>
k=base64:<encoded encryption key>
k=uri:<URI to obtain key>
k=prompt

媒体级别信息

媒体描述(m)

表示一个会话的媒体信息;

格式: m=(媒体类型)(端⼝号码)(传送层协议)(格式列表)


        media:媒体类型。有"audio",“video”,“application”,“data”(不向用户显示的数据),“control”(描述额外的控制通道);
        port:表示媒体流发往传输层的端口,对于RTP,偶数端口用来传输数据,奇数端口
对应RTCP用来传输信令;
        transport type:表示传输协议,与"c="一行相关联,一般用RTP/AVP表示,即 Realtime Transport Protocol using the Audio/Video profile over udp,即我们常说的RTP over udp;
        fmt list:表示媒体格式,分为静态绑定和动态绑定;
                静态绑定:媒体编码方式与RTP负载类型有确定的一一对应关系,如: m=audio 0 RTP/AVP 8;
                动态绑定:媒体编码方式没有完全确定,需要使用rtpmap进行进一步的说明;如下例子

                        m=video 0 RTP/AVP 96
                        a=rtpmap:96 H264/90000

该例子说明, 可以理解为 m 是video的,端口号由于还没有指定目前为0,传输协议为RTP/AVP,媒体格式为96(协议中称之为 payload type),这个96是啥意思呢?在 a=rtpmap中说明了,对应的编码名称为h264, clock rate为90000.。。关于a的详尽说明,参考后面a属性的说明。
        fmt list : 对应对应的⾳频负载类型(PT) 如果格式列表中 列出了所⽀持的所有不同类型的媒体格式。优先使⽤靠前的格式。( 15 3 0
格式列表中只有一个的例子
m=video 0 RTP/AVP 96
如果某个系统准备在端⼝ 45678 可以处理⼏种编码的语⾳: G.728 编码格式(负载类型为15)、 GSM 编码 格式(负载类型为3)、 G.711 u 编码格式(负载类型为0),⽽且系统优先采⽤ G.728 格式,则相应的媒体 信息如下所示:
格式列表中支持多个的例子
m=audio 45678 RTP/AVP 15 3 0

媒体信息(i)(可选)

协议中关于在媒体信息中的说明如下:
i=* (media title)

连接信息(c)(会话级进⾏了规定,这⾥可选)

带宽信息(b)(可选)

加密密钥(k)(可选)

属性(a)(可选,但是一般都要填充)

属性有两种形式,第⼀种是特征属性,第⼆种属于值属性。SDP描述了多个建议属性。

a=<attribute>
a=<attribute>:<value>

特征属性:

例如a=sendonly  表明会话描述的发送者只希望发送数据⽽不打算接收数据,端⼝号⽆意义,可以置为0。

例如 a=recvonly   表明这个会话描述的发送者只想接收数据⽽不打算发送数据。
值属性:
a= rtpmap 在协议中,SIP建议尽量 使用该属性 ,因此要特别分析一下
格式:a=rtpmap:(净荷类型)(编码名)/(时钟速率)【/(编码参数)】
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
a=control:(⾳/视频连接信息)
a=control:rtsp://192.168.1.197/h264stream0/trackID=0
a=rtpmap:96 H264/90000
a=rtpmap 
rtpmap 属性提供了⼀个在 VoIP 应⽤中的重要属性使⽤⽅法,该属性可⽤于媒体流,在媒体格式不是静态的 RTP 负载类型时特别有⽤。
严格来说, “rtpmap” 只在使⽤动态负载类型情况下才是必须的,例如标准的 G.711 语⾳是静态 RTP 负载类 型,采⽤如下⽅法就可以对它完整描述:
m=audio 45678 RTP/AVP 0
⽽对动态负载来说需要指定更多信息才能使远端完全识别到媒体编码,例如 16 位线性编码 16kHz 取样的⽴ 体声⾳就是⼀个动态 RTP 负载类型,如果我们采⽤动态负载类型 98 表示这个媒体流,那么 SDP 格式如下:
m=audio 45678 RTP/AVP 98
a=rtpmap 98 L16/16000/2
SIP 建议⽆论是静态负载还是动态负载,尽量都要采⽤该属性
a=rtpmap在协议中,SIP建议尽量使用该属性,因此要特别分析一下,

参见上面的分析

a=fmtp


fmtp(format parameters)用于指定媒体数据格式。

格式:a=fmtp:<format> <format specific parameters>

示例:a=fmtp:111 minptime=10;useinbandfec=1

表示PayloadType值为111的数据(Opus数据):以10ms长的音频数据为一帧,且数据经FEC(Forward Error Correction,前向纠错)编码。

 结合起来分析:

Media Description, name and address (m): video 0 RTP/AVP 96   
        Media Attribute (a): rtpmap:96 H264/90000
        Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
        Media Attribute (a): control:streamid=0

我是video媒体类型,目前接口为0,,使用RTP/AVP协议,使用媒体格式编号为96

        rtpmap 则说明 96代码的是 h264编码,时钟速率为90000

        fmtp (format parameters)说明 96媒体数据的格式 :

                        packetization-mode =1;

                        sprop-parameter-sets = Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA;

                        profile-level-id=640028

         control:streamid=0 说明ffmpeg对应的streamid 为0

例子

    Session Description Protocol
        Session Description Protocol Version (v): 0
        Owner/Creator, Session Id (o): - 0 0 IN IP4 127.0.0.1
        Session Name (s): No Name
        Connection Information (c): IN IP4 192.168.245.130
        Time Description, active time (t): 0 0
        Session Attribute (a): tool:libavformat 60.3.100
        Media Description, name and address (m): video 0 RTP/AVP 96
        Media Attribute (a): rtpmap:96 H264/90000
        Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
        Media Attribute (a): control:streamid=0
        Media Description, name and address (m): audio 0 RTP/AVP 97
        Bandwidth Information (b): AS:128
        Media Attribute (a): rtpmap:97 MPEG4-GENERIC/44100/2
        Media Attribute (a): fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500
        Media Attribute (a): control:streamid=1

技巧:在 cmd 上打开 SDP 的log用来观察SDP的 内容

1. 启动 RTSP 服务器后

2. 使用ffmpeg 推流 或者ffplay拉流的时候 后面加上  -loglevel 40

使用推流 和 拉流的 方式打开

ffmpeg -re -i "zerenlian.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40
 

ffplay -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 中 工作目录 和 暂存区 的区别理解

比喻解释 可以把工作目录和暂存区想象成两个篮子&#xff1a; 工作目录是你把所有东西&#xff08;文件和更改&#xff09;扔进去的地方。你正在修改的东西都放在这里。暂存区则是你整理好的东西放进第二个篮子&#xff0c;准备提交给老板&#xff08;提交到仓库&#xff09;…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

接口测试Day04-postman生成测试报告ihrm项目

测试报告-利用newman插件 安装node.js 安装 双击 .msi 文件&#xff0c;一路下一步安装即可。无需特殊设定。测试安装成功 npm -v 安装npm 安装newman 安装newman npm install -g newman试安装成功 newman -v安装newman插件 - 扩展版 npm install -g newman-reporter-htmlex…

使用Locust对Redis进行负载测试

1.安装环境 安装redis brew install redis 开启redis服务 brew services start redis 停止redis服务 brew services stop redis 安装Python库 pip install locust redis 2.编写脚本 loadTest.py # codingutf-8 import json import random import time import redis …

【Vim Masterclass 笔记01】Section 1:Course Overview + Section 2:Vim Quickstart

文章目录 Section 1&#xff1a;Course Introduction 课程概述S01L01 Course Overview 课程简介课程概要 S01L02 Course Download 课程资源下载S01L03 What Vim Is and Why You Should Learn It 何为 Vim&#xff1f;学来干啥&#xff1f;1 何为 Vim2 为何学 Vim Section 2&…

【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地

前言&#xff1a;本文教程为&#xff0c;上传文件到服务器并训练深度学习模型&#xff0c;与下载服务器文件到本地。演示指令输入&#xff0c;完整的上传文件到服务器&#xff0c;并训练模型过程&#xff1b;并演示完整的下载服务器文件到本地的过程。 本文使用的服务器为云服…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…

vs2022编译opencv 4.10.0

参考&#xff1a;Windosw下Visual Studio2022编译OpenCV与参考区别在于&#xff0c;没有用cmake GUI&#xff0c;也没有创建build目录&#xff0c;直接用vs2022打开了C:\code\opencv目录&#xff0c;即CMakeLists.txt所在根目录。没有修改默认下载地址&#xff0c;采用手动下载…

centos7 免安装mysql5.7及配置(支持多个mysql)

一&#xff09; 下载免安装包&#xff1a; mysql下载地址: https://dev.mysql.com/downloads/mysql/下载时&#xff0c;选择以前5.7版本&#xff1a; image 下载第一个TAR压缩包&#xff1a; image 二&#xff09; 定义安装路径并解压安装包 1、假设需要把MySQL放到 /usr/local…

怎样在 Word 文档中插入附件(其他文件)?

在 Office &#xff08;比如 Word、Excel 等&#xff09;中是可以插入附件的&#xff0c;比如插入文本文档、视频文件、音乐文件等。本经验就来讲一讲&#xff0c;怎样在 Word 文档中插入附件或其他文件&#xff1f; 在打开的“对象”对话框中&#xff0c;单击【由文件创建】选…

springboot集成websokcet+H5开发聊天原型(二)

本文没有写完~~~~ 聊天相关数据结构&#xff1a; 我们初步设计了如下几个数据结构。 //存放 sessionId 与 userId 的map private Map<String,String> sessionId_userId new HashMap<>(); // 用于存储用户与群组的关联关系&#xff0c;键为用户ID&#xff0c;值…

vue实现下拉多选、可搜索、全选功能

最后的效果就是树形的下拉多选&#xff0c;可选择任意一级选项&#xff0c;下拉框中有一个按钮可以实现全选&#xff0c;也支持搜索功能。 在mounted生命周期里面获取全部部门的数据&#xff0c;handleTree是讲接口返回的数据整理成树形结构&#xff0c;可以自行解决 <div c…

Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集DTA介绍算法流程 DTA代码实现DTA算法实现攻击效果 代码汇总dta.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建…

攻防世界web第六题upload1

这是题目&#xff0c;可以看出是个上传文件的题目&#xff0c;考虑文件上传漏洞&#xff0c;先随便上传一个文件试试&#xff0c;要求上传的是图片。 可以看到上传成功。 考虑用一句话木马解决&#xff0c;构造文件并修改后缀为jpg,然后上传。 <?php eval($_POST[attack])…

python数据分析:使用pandas库读取和编辑Excel表

使用 Pandas&#xff0c;我们可以轻松地读取和写入Excel 文件&#xff0c;之前文章我们介绍了其他多种方法。 使用前确保已经安装pandas和 openpyxl库&#xff08;默认使用该库处理Excel文件&#xff09;。没有安装的可以使用pip命令安装&#xff1a; pip install pandas ope…

SpringCloud源码分析-LoadBalancer

# 负载均衡缓存 org.springframework.cloud.loadbalancer.cache.DefaultLoadBalancerCache # 缓存服务实例提供 org.springframework.cloud.loadbalancer.core.CachingServiceInstanceListSupplier 负载均衡实例中没有机器列表时&#xff0c;都会查询一次org.springframewor…

Postman[2] 入门——界面介绍

可参考官方 文档 Postman 导航 | Postman 官方帮助文档中文版Postman 拥有各种工具、视图和控件&#xff0c;帮助你管理 API 项目。本指南是对 Postman 主要界面区域的高级概述&#xff1a;https://postman.xiniushu.com/docs/getting-started/navigating-postman 1. Header&a…

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点&#xff1a; 4、自定义bean对象实现序列化接口&#xff08;Writable&#xff09; 4…

Python爬取城市天气信息,并存储到csv文件中

1.爬取的网址为&#xff1a;天气网 (weather.com.cn) 2.需要建立Weather.txt文件&#xff0c;并在里面加入如下形式的字段&#xff1a; 101120701济宁 101010100北京 3.代码运行后&#xff0c;在命令行输入Weather.txt文件中添加过的城市&#xff0c;如&#xff1a;济宁。 …

CentOS Stream 9 安装 JDK

安装前检查 java --version注&#xff1a;此时说明已安装过JDK&#xff0c;否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用&#xff0c;或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads…