流媒体之RTMP协议(其四)

news2024/11/15 2:04:01

在这里插入图片描述

欢迎诸位来阅读在下的博文~
在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力!

江山如画,客心如若,欢迎到访,一展风采

文章目录

  • 前期博客
  • 参考书籍
  • 一、PTMP简介
  • 二、RTMP的交互流程
      • 1.握手
      • 2.建立连接
      • 3.建立流
      • 4.RTMP播放
  • 三、RTMP相关名词解析
  • 四、直播推流与拉流
      • 直播推流
      • 直播拉流
  • 五、RTMP消息

前期博客

流媒体与直播的基础理论(其一)
流媒体协议RTSP(其二)
流媒体协议HLS(其三)

参考书籍

《FFmpeg入门详解——流媒体直播原理及应用》——梅会东

一、PTMP简介

RTMP,实时消息传输协议基于TCP,是一个协议簇,包括RTMP基本协议及RTMPT/RTPS/PTMPE等多种变种。RTMP是一种用于进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/Red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。

  • 采用tcp协议,避免了多媒体数据在广域网传输过程中的丢包对质量造成影响。
  • 采用FLV封装格式,支持H.264视频编码方式,可以在很低的码率下显示质量还不错的画面。
  • 基于udp的RTMFP是其一个变种,能提高实时性问题。
  • 一个重大局限是,该协议的播放依赖于Flash Player,由于Flash Player存在安全漏洞问题,现在不受欢迎了。
  • 目前常用来进行推流。

变种解析:

  • RTMP工作在TCP之上,默认的端口号是1935。
  • RTMPE在RTMP的基础上增加了加密功能。
  • RTMPT封装在HTTP请求之上,可穿透防火墙。
  • RTMPS类似于RTMPT,增加了TLS/SSL的安全功能。

二、RTMP的交互流程

RTMP Client与RTMP Server的交互流程分为4个步骤:

  1. 握手,类似于TCP握手
  2. 建立连接,建立客户端和服务器之间的“网络连接”。
  3. 建立流,建立客户端和服务器之间的“网络流”。
  4. 播放/发送,传输音视频数据。

1.握手

RTMP握手过程中,服务器和客户端都需要发送大小固定的3个数据块。其中,客户端要发送C0,C1,C2三个块;服务器要发送S0,S1,S2三个块。
三个块的发送要符合以下规则:
(1)客户端要收到S之后,才能发送C2.
(2)客户端要收到S2之后才能发送其它信息。
(3)服务器要等到收到C0之后发送S1.
(4)服务器必须等到收到C1之后才能发送S2.
(5)服务器必须收到C2之后才能发送其它信息。
常见的一种满足规则的发送方式如下:
在这里插入图片描述
这种通信方式可以使得通信次数最小。

2.建立连接

在这里插入图片描述

  • 客户端发送“connect”,请求与一个服务应用实例建立连接。
  • 服务器接收到连接命令后,将确认窗口大小协议发送到客户端,同时连接到connect命令中提到的应用程序。
  • 服务器将设置带宽协议消息发送到客户端。
  • 客户端处理设置带宽协议消息后,将确认窗口大小协议消息发送到服务器端。
  • 服务器将用户控制消息中的“流开始”消息发送到客户端。
  • 服务器端发送命令消息中的“结果”(_result),通知客户端连接状态。

3.建立流

(1)客户端将命令消息中的“创建流”命令发送到服务器端。
(2)服务器端接收到“创建流”命令后,发送命令消息中的“结果”,通知客户端。

4.RTMP播放

在这里插入图片描述

RTMP建立流一般如下:
(1)客户端将命令消息中的“播放”命令发送到服务器端。
(2)接收到播放命令后,服务器端发送设置块大小协议消息。
(3)服务器端发送用户控制消息中的Stream Begin,告知客户端流ID。
(4)播放命令成功,服务器端发送命令消息中的“响应状态”,告知客户端“播放”命令执行成功。
(5)在此之后服务器端发送客户端要播放的音视频数据。

三、RTMP相关名词解析

(1)Packet,即数据包,一个数据包由一个固定头和有效载荷构成。
(2)Payload,即有效载荷,是存储在一个数据包中的数据,例如声频采样或者压缩的视频数据。
(3)Port,即端口,传输协议用来指定端口号。
(4)Transport Address,即传输地址,标识传输层端点的网地址和端口的组合,例如一个IP地址和一个TCP端口。
(5)Message Stream,即消息流,是指通信中消息流通的一个逻辑通道。
(6)Message Stream ID,即消息流ID,每条消息流有一个关联的ID,使用ID标识流通道中的消息流。
(7)Chunk,即块,是指消息在发送之前被拆开分为很多小的块,以确保端到端交付所有消息有序。
(8)Chunk Stream,即块流,指通信中允许块流向一个特定方向的逻辑通道。块流可从客户端流向服务器端,也可以从服务器端流向客户端。
(9)Chunk ID,即块流ID,每个块有一个关联的ID,使用ID标识流通道中的块流。
(10)Metadata,即元数据,关于数据的描述,例如一部电影的Metadata包括电影的标题、持续时间、创建时间等。

四、直播推流与拉流

直播推流,指的是把采集阶段封包好的内容传输到服务器的过程。拉流则相反,从服务器把数据拉回到客户端观看的过程。

  • 推流常用的协议是RTMP,因为RTMP的延时很低。
  • RTMP协议将推流端的数据发送到服务器后,再通过一定的QoS算法将音视频流数据推送到网络端,最后进行CDN分发。

在这里插入图片描述

直播推流

以下是参考的步骤:
(1)经过采集设备得到原始的采集数据,包括视频数据(YUV)和声频数据(PCM)。
(2)使用硬编码或软编码(FFmpeg)来编码压缩音视频数据。
(3)分别得到已编码的H.264视频数据和AAC声频数据。
(4)采取不同的封装格式,如 FLV、TS、MPEG-TS等。
(5)HLS分段生成策略及m3u8索引文件(在使用HLS协议时,附加的一步)。
(6)通过流上传到服务器。
(7)服务器进行相关的协议的分发。
优化方案:

  • QoS策略。推流端会根据当前上行网络情况控制音视频数据发包和编码,在网络较差的情况下,音视频数据发送不出去,会造成数据滞留在本地,此时会停掉编码器,防止发送数据进一步滞留,同时会根据网络情况选择合适的策略控制音视频的发送。例如在网络很差的情况下,推流端会优先发送声频数据,保证用户能听到声音,并在一定间隔内发送关键帧数据,保证用户在一定时间间隔之后能看到一些画面的变化。
  • 合理的关键帧配置。合理控制关键帧发送间隔(建议2s或者1s发送一个),这样可以减少后端处理过程,为将后端的缓冲区设置得更小创造条件。

整个推流过程如下:
在这里插入图片描述

直播拉流

一般来讲,直播拉流的步骤如下:
(1)根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据。
(2)解析二进制数据,从中找到相关流信息。
(3)根据不同的封装格式(如FLV、TS)解复用(demux)。
(4)分别得到已编码的H.264视频数据和AAC声频数据。
(5)使用硬解码(对应系统的API)或软解码(FFmpeg)来解压音视频数据。
(6)经过解码后得到原始的视频数据(YUV),和声频数据(PCM)。
(7)因为声频和视频解码是分开的,所以需要把它同步起来,否则会出现音视频不同步的问题。
(8)最后把同步的声频数据发送到耳机或外放,将视频数据发送到屏幕上。

首频优化:

  • 通过预设解码器类型,省去探测文件类型的时间。
  • 缩小视频数据探测范围,同时也意味着减少了需要下载的数据量,特别是在网络不好时,减少下载的数据量能为启动播放节省大量短时间,当检测到I帧数据后就立即返回并进入解码环节。
    在这里插入图片描述

五、RTMP消息

RTMP消息在传输过程中,会被划分成块,这样可以避免内容较大的消息阻塞后面内容较小,但是优先级更高的消息,如声频或者控制数据。
RTMP消息包含两部分,及消息头(Message Header)和 消息负载(Message Payload)。

  • 消息头
    消息类型(1字节)、负载长度(3字节)、时间戳(4字节)、流ID(3字节)等字段。

未完。。。

在这里插入图片描述
望诸位不忘三连支持一下~

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

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

相关文章

MyBatis的配置文件详解

01-MyBatis的配置文件详解 创建的接口和xml文件的名字最好写一样的要不然会出问题,然后和接口名相同的xml文件在resources下创建个和接口相同文件夹把xml文件放进去,而且resources下的创建的文件夹需要一级一级的创键,比如:cn创建完,创建tulingxue,然后再创建mapper文件夹才行…

python绘制月亮

import matplotlib import matplotlib.pyplot as plt import moviepy.editor as mpymatplotlib.rcParams[font.family] SimHei# 坐标列表 positions [(0, 0), (1 / 4, 1 / 4), (1 / 3, 1 / 4), (1 / 2, 1 / 4), (2 / 3, 1 / 4),(3 / 4, 1 / 4), (1, 1 / 4), (5 / 4, 1 / 4), …

C++中的容器——vector

1. vector的介绍 vector:vector的底层实际上就是一个数组(也称为顺序表),数据是连续存储在数组中的,因此vector是可以使用下标来进行访问的,但是它的大小并不是像数组一样是固定的,而是可以动态…

漳州自闭症寄宿学校,孩子的快乐学习乐园

在温暖而包容的南方都市——广州,藏着一所特别的学校,它以爱为名,为自闭症儿童编织了一个充满希望的未来,这就是星贝育园自闭症儿童寄宿制学校。这里,不仅是知识的殿堂,更是孩子们心灵得以自由飞翔、快乐学…

削峰+限流:秒杀场景下的高并发写请求解决方案

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,一个29岁、活泼积极、热衷分享技术的码农。今天和大家聊一聊应对高并发的写请求这个主题,尤其是在大促、秒杀这种场景下,系统…

【Docker Nexus3】maven 私库

1.部署环境 window 11 x64Docker Desktop 4.34.1 (166053) Docker Engine v27.2.0 1.1.Docker 镜像源 1.1.1.Docker Engine 配置 {"builder": {"features": {"buildkit": true},"gc": {"defaultKeepStorage": "32…

微服务_入门2

文章目录 一、Feign二、Gateway服务网关 一、Feign 来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一(url需要自己在代码中拼写出来)参数复杂URL难以维护&#xff0…

Weapons Armor PBR Pack 1 - Fantasy RPG 武器护甲游戏模型

武器和护甲包#1有30个武器和护甲,每个对象都有默认外观,大多数都有网格变形和Substance Painter源文件,用于自定义纹理。 无限PBR&我的哲学 Infinity PBR是十几位艺术家的作品,他们都在做自己最擅长的事情。我想为独立游戏开发者制作最通用、最优质的资产,按照我希望的…

鸿蒙开发之ArkUI 界面篇 四

文字溢出处理、省略号、文字太长的处理用textOverflow,语法格式是: Text.textOverflow({ overflow: TextOverflow; }) 尤其注意,单独的这个设置没有效果,需要和maxLines一起使用才有效果 Text("男频男频男频男频男频男频男…

好代码网同款wordpress主题,完全开源无加密可二开

这个其实就是好代码网站的早期整站打包代码,当时售价198的,现在里面的部分数据已经过期了,只能展示效果,没法下载。所以就只当做主题分享给大家使用。 资源下载类网站目前还是红利期,搞个特价主机和域名,再…

代码随想录Day 46|动态规划完结,leetcode题目:647. 回文子串、516.最长回文子序列

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一:647. 回文子串解题思路:暴力解法动态规划 题目二: 516.最长回文子序列解题思路: 动态规划总结动规五部曲基础概念常见问题类型 动态规划…

算法设计与分析(循环赛日程表

目录 循环赛日程表算法介绍代码实现注意事项 小结: 循环赛日程表 在组织和安排体育赛事时,循环赛日程表的编制是一项重要且复杂的任务。循环赛,即每个参赛队伍都要与其他所有队伍进行一场比赛,确保比赛的公平性和所有队伍之间的平…

Linux下的CAN通讯

CAN总线 CAN总线简介 CAN&#xff08;Controller Area Network&#xff09;总线是一种多主从式 <font color red>异步半双工串行 </font> 通信总线&#xff0c;它最早由Bosch公司开发&#xff0c;用于汽车电子系统。CAN总线具有以下特点&#xff1a; 多主从式&a…

JAVA基础面试题总结(十五)——设计模式

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

面向对象程序设计(C++)———多态

1.认识多态 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我们…

一分钟掌握 Excel VBA 技巧,轻松批量生成工资条,提高工作效率!

可能大家忽视了一点&#xff0c;Excel是我们日常办公中使用最多的工具&#xff0c;所以&#xff0c;学好Excel并加以运用&#xff0c;一定能提升你的工作效率&#xff0c;比如Excel VBA可以用代码实现自动化办公&#xff0c;下面举一个Excel VBA批量生成工资条的办公小案例。 …

swagger新玩法 - 让你API接口开发原地起飞

作为Java后台接口开发人员&#xff0c;无论对对接方是前端还是第三方&#xff0c;很多时候我们在文档和代码两头都需要费心&#xff0c;而做到自动的同步将会非常省心。本教程将带你领略下如何借助swagger官方提供的新玩法&#xff0c;让你的API接口开发原地起飞&#xff0c;甚…

34.贪心算法1

0.贪心算法 1.柠檬水找零&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元&#xff1a;直接收下…

4. Python之运算符

一. Python运算符 常用的运算符有&#xff1a;算述运算符&#xff0c;赋值运算符&#xff0c;比较运算述&#xff0c;逻辑运算符&#xff0c;位运算符等等。 1. 算述运算符 用于处理四则运算的符号&#xff0c;主要有&#xff1a; 运算符描述加法-减法*乘法/除法//整除%取余…

嵌入式DCMI摄像头功能调试方法

STM32F407芯片带有DCMI接口,在我们的核心板上已经将接口用18PIN的FPC座子引出。 这个接口可以接我们的OV2640接口。 本节我们开始调试摄像头。 16.1. DCMI DCMI接口是ST自己定义的接口。 Digital camera interface (DCMI),是意法半导体公司产品STM32F4xx系列芯片的快速摄像头…