rtsp rtmp 跟 http 区别

SDP

一SDP介绍

1. SDP的核心功能
  • 会话描述:定义会话的名称、创建者、时间范围、连接地址等全局信息。
  • 媒体协商:明确媒体流的类型(如音频、视频)、传输协议(如RTP/UDP)、编码格式(如H.264、Opus)及端口信息。
  • 网络参数:指定单播或多播地址、带宽限制、加密密钥等网络相关配置。
  • 兼容性支持:通过文本格式的灵活扩展,适配不同传输协议(如SIP、RTSP、WebRTC)。
2. SDP的协议结构

SDP由会话级描述媒体级描述两部分组成,采用<type>=<value>的文本格式,每行以单个字母表示类型,如v(版本)、m(媒体)等。

(1)会话级描述(Session-Level)
  • 必选字段
    • v=:协议版本(固定为v=0)。
    • o=:会话创建者信息,格式为o=<用户名> <会话ID> <版本号> <网络类型> <地址类型> <地址>
    • s=:会话名称,若未命名则用-占位。
    • t=:会话的起止时间(NTP时间戳)。
  • 可选字段
    • c=:连接信息(如c=IN IP4 192.168.1.1)。
    • b=:带宽限制(如b=AS:500表示单媒体最大带宽500kbps)。
    • a=:扩展属性(如加密方式a=crypto:1 AES_CM_128_HMAC_SHA1_80)。
(2)媒体级描述(Media-Level)

每个媒体流以m=行开头,描述具体参数:

  • 必选字段
    • m=:媒体类型(如audio/video)、端口、传输协议、负载类型列表(如m=audio 5004 RTP/AVP 96)。
  • 关键属性
    • a=rtpmap:动态负载类型与编码格式的映射(如a=rtpmap:96 H264/90000)。
    • a=fmtp:编码参数的详细配置(如a=fmtp:96 profile-level-id=42801f)。
    • a=sendrecv:媒体流方向(sendonly/recvonly/inactive)。

3. SDP在流媒体中的应用场景
  1. 实时通信(WebRTC)
    在WebRTC中,SDP通过Offer/Answer模型交换双方的媒体能力(如支持的编解码器),并配合ICE协议完成网络穿透。

  2. 视频会议与直播
    描述多路音视频流的传输参数,支持多播地址分配和分层编码(如H.264的分辨率适配)。

  3. 流媒体传输(RTSP)
    RTSP协议通过SDP在DESCRIBE响应中传递媒体信息(如文件格式、时间范围),客户端据此发起播放请求。

  4. 网络电话(VoIP)
    协商音频编码格式(如G.711、Opus)和传输地址,确保通话双方兼容。


4. SDP的示例与解析

以下是一个简化的SDP示例:

v=0
o=- 123456789 2 IN IP4 192.168.1.1
s=Example Session
c=IN IP4 192.168.1.1
t=0 0
m=audio 5004 RTP/AVP 96
a=rtpmap:96 OPUS/48000/2
a=sendrecv
m=video 5006 RTP/AVP 97
a=rtpmap:97 H264/90000
a=fmtp:97 profile-level-id=42e01f
  • 会话级:定义版本、创建者IP和会话名称。
  • 音频流:使用Opus编码,采样率48kHz,双向传输。
  • 视频流:H.264编码,支持特定分辨率配置。

5. SDP的局限性
  • 无协商能力:仅描述媒体信息,编码协商需依赖RTSP等协议。
  • 静态配置:不支持动态调整参数(如带宽自适应),需结合其他协议实现。

二 会话管理 与SDP

1. RTSP(Real Time Streaming Protocol

(1) 是否需要建立会话?
  • 需要显式会话
    RTSP 是基于会话的协议,客户端与服务端通过 SETUPPLAYTEARDOWN 等命令明确控制会话生命周期。
    • 会话标识:通过 Session 头字段维护会话状态(如 Session: 12345678)。
(2) 是否需要 SDP?
  • 需要 SDP
    RTSP 使用 SDP(Session Description Protocol)在 DESCRIBE 响应中描述媒体流的详细信息:
    m=video 0 RTP/AVP 96
    a=rtpmap:96 H264/90000
    a=control:track1
    
    • 作用:定义媒体类型(视频/音频)、编码格式、传输协议(RTP)、控制路径等。

2. RTMP(Real-Time Messaging Protocol)

(1) 是否需要建立会话?
  • 通过隐式连接管理会话
    RTMP 不显式声明会话,但通过以下机制维护逻辑会话:
    • NetConnection:客户端与服务端建立持久 TCP 连接(类似会话)。
    • NetStream:在连接内创建多个流通道(如 stream ID=1),每个流独立传输数据。
(2) 是否需要 SDP?
  • 不需要 SDP
    RTMP 通过以下方式传递媒体参数:
    • 元数据(onMetaData):客户端在发布流时发送元数据(分辨率、编码格式等)。
      > onMetaData: { width: 1280, height: 720, videocodecid: 7 (H.264) }
      
    • 编码协商:客户端在 connect 命令中声明支持的编解码能力(如 videoCodecs: 128)。

3. HTTP流媒体(如HLS、DASH)

(1) 是否需要建立会话?
  • 无显式会话
    HTTP流媒体基于无状态的HTTP协议,通过请求-响应模式获取媒体分片:
    • HLS:客户端通过HTTP GET请求获取 .m3u8 索引文件和 .ts 分片。
    • DASH:客户端获取 .mpd 清单文件并请求 .m4s 分片。
(2) 是否需要 SDP?
  • 不需要 SDP
    媒体参数通过以下方式描述:
    • 清单文件:如HLS的 .m3u8 或DASH的 .mpd,包含码率、分辨率、分片URL等信息。
      #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
      stream_360p.ts
      

对比总结

协议会话管理媒体描述方式典型场景
RTSP显式会话(SETUP/PLAYSDP(DESCRIBE响应)视频监控、IPTV
RTMP隐式会话(NetConnection)元数据(onMetaData直播推流、低延迟交互
HTTP流媒体无会话(无状态HTTP)清单文件(m3u8/mpd)自适应流(HLS/DASH)

关键区别解释

1. 会话管理
  • RTSP:需要显式控制会话状态(如播放、暂停),适合需要精细控制的场景。
  • RTMP:通过长连接维护隐式会话,适合持续流传输(如直播)。
  • HTTP流媒体:无会话,每次请求独立,适合CDN分发和自适应码率。
2. 媒体参数传递
  • RTSP:依赖SDP标准化描述,确保跨平台兼容性。
  • RTMP:通过私有元数据和命令协商参数,灵活性高但标准化较弱。
  • HTTP流媒体:通过清单文件静态描述,支持动态切换码率。

适用场景建议

  • 低延迟控制:RTMP(1-3秒)或 RTSP(配合RTP)。
  • 高兼容性分发:HTTP(HLS/DASH)。
  • 设备控制:RTSP(如摄像头PTZ控制)。

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

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

相关文章

Containerd 简介、安装与使用指南

1. Containerd 简介 Containerd 是一个开源的容器运行时&#xff0c;专注于管理容器的生命周期。它最初是 Docker 的一部分&#xff0c;后来被分离出来成为一个独立的项目&#xff0c;并成为 Kubernetes 和其他容器平台的底层运行时。Containerd 提供了容器的创建、启动、停止…

开源语音克隆项目 OpenVoice V2 本地部署

#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…

【Prometheus】prometheus结合domain_exporter实现域名监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

rustdesk编译修改名字

最近&#xff0c;我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块&#xff0c;认识比较疏浅&#xff0c;有错误欢迎指正。 为什么要重写&#xff1f; 这个模块2W行代码量看起来不多&#xff0c;却在线上时常故障&#xff0c;永远改不完。…

在linux系统中安装Anaconda,并使用conda

系统 : ubuntu20.04 显卡&#xff1a;NVIDIA GTX1650 目录 安装Anaconda第一步&#xff1a;下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令&#xff1a;uname -a2. 下载合适版本的Anconda 第二步&#xff1a;安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…

(前端基础)HTML(一)

前提 W3C:World Wide Web Consortium&#xff08;万维网联盟&#xff09; Web技术领域最权威和具有影响力的国际中立性技术标准机构 其中标准包括&#xff1a;机构化标准语言&#xff08;HTML、XML&#xff09; 表现标准语言&#xff08;CSS&#xff09; 行为标准&#xf…

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase03 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-003测试用例 用例ID测试场景验证要点参考条款预期…

TDengine 客户端连接工具 taos-Cli

简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具&#xff08;以下简称 TDengine CLI&#xff09;是用户操作 TDengine 实例并与之交互最简…

Git高级用法

GIT高级用法及实战案例解析 前言 作为现代开发者的必备工具&#xff0c;Git的基础操作&#xff08;add/commit/push&#xff09;早已深入人心。但当面对复杂场景时&#xff0c;掌握Git的高级用法将极大提升开发效率。本文将深入解析Git的高级功能&#xff0c;并配合真实场景案…

9个用于测试自动化的最佳AI测试工具(2024)

选择一款优质的基于生成式AI人工智能的测试工具能够确保测试过程的准确性和效率&#xff0c;从而加速整个软件测试周期。相反&#xff0c;设计不佳的测试工具可能无法发现错误&#xff0c;并可能存在安全问题。它们可能产生误报或漏报&#xff0c;误导开发与测试团队&#xff0…

vue-model如何自定义指令,及批量注册自定义指令

一、在Vue.js中&#xff0c;v-model是一个用于在表单输入和应用状态之间创建双向绑定的指令。要编写自定义的v-model指令&#xff0c;你需要使用Vue的自定义指令API。以下是编写自定义v-model指令的步骤&#xff1a; 定义一个自定义指令对象。在指令对象的bind钩子函数中&…

简单认识一下-Redis

一、什么是Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;它既可以用作数据库、缓存&#xff0c;也可以作为消息中间件使用。以下为你详细介绍 Redis&#xff1a; 基本特点 高性能&#xff1a;Redis 将数…

LabVIEW的吞雨测控系统

本案例介绍了一种基于LabVIEW开发的吞雨测控系统&#xff0c;该系统通过建模仿真分析不同控制器模式下的阶跃信号响应&#xff0c;从而选择了最适合的控制器。为了有效解决在控制流量过程中出现的振荡收敛和流量信号大扰动问题&#xff0c;系统采用了改进的积分分离PID算法&…

C++中的顺序容器(一)

文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…

Javaweb中,使用Servlet编写简单的接口

案例&#xff1a;网页提交用户名和密码信息&#xff0c;后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…

C语言实现的常见排序算法

排序是计算机科学中非常重要的基础算法之一。无论是在数据分析、数据库查询还是图形界面中&#xff0c;我们都可能会遇到排序问题。本文将介绍几种常见的排序算法&#xff0c;并提供其C语言实现代码。排序算法的效率和应用场景有很大关系&#xff0c;不同的算法有不同的时间复杂…

对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端

1. 使用Fetch API发送HTTP请求&#xff08;最简单的方式&#xff09;&#xff1a; //home.html // 示例&#xff1a;提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…

[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation &#xff1a;4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授&#xff0c;也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…

案例-04.部门管理-删除

一.功能演示 二.需求说明 三.接口文档 四.思路 既然是通过id删除对应的部门&#xff0c;那么必然要获取到前端请求的要删除部门的id。id作为请求路径传递过来&#xff0c;那么要从请求路径中获取&#xff0c;id是一个路径参数。因此使用注解PathVariable获取路径参数。 请求方…

Blazor-父子组件传递任意参数

在我们从父组件传参数给子组件时&#xff0c;可以通过子组件定义的[Parameter]特性的公开属性进行传值&#xff0c;但是当我们需要传递多个值的时候&#xff0c;就需要通过[Parameter]特性定义多个属性&#xff0c;有没有更简便的方式&#xff1f; 我们可以使用定义 IDictionar…