​自从互联网普及之后,用于视频直播的流媒体技术就发展起来。这几十年中,比较有影响的主要有MMS、RTSP、RTMP、HLS、SRT、RIST几种,分别介绍如下。

1、MMS协议

MMS全称Microsoft Multimedia Server,意思是微软多媒体服务器,它是微软公司在上世纪九十年代发布的多媒体服务器解决方案,可用于传输微软音视频格式的流媒体直播数据。

MMS协议的直播地址形如mms://***,可通过MMS传输的视频格式为WMV,音频格式为WMA,音视频数据封装之后的文件格式为ASF。

MMS协议内部又分为MMSU和MMST,其中MMSU表示MMS协议结合UDP数据传送。如果MMSU连接失败,服务器会尝试使用MMST,这个MMST表示MMS协议结合TCP数据传送。

因为MMS协议由微软公司提出,不兼容其他格式的音视频数据流,所以随着WMV/WMA标准的式微,MMS协议也逐渐无人问津了。

2、RTSP协议

RTSP全称Real Time Streaming Protocol,意思是实时流传输协议,它是网景公司和RealNetworks公司在上世纪九十年代联合提出的多媒体实时传输协议。

RTSP协议的直播地址形如rtsp://***,早期可通过RTSP传输的视频格式为RM,音频格式为RA,音视频数据封装之后的文件格式为RM或RMVB。后来RTSP协议增加支持MPEG的音视频标准,即支持传输视频格式H.264,音频格式AAC。

RTSP协议的安全版本是RTSPS,也就是给RTSP协议增加了TLS/SSL支持。RTSPS使用了TLS/SSL协议来加密和保护数据传输,以防止数据在传输过程中被窃听和篡改。

因为RTSP提出较早,对服务端的复杂度要求比较高,以至流媒体服务器SRS干脆放弃支持RTSP协议,直播录制软件OBS Studio也没支持该协议。在流媒体服务器中,EasyDarwin、MediaMTX、ZLMediaKit支持RTSP协议。手机直播软件则有RTMP Streamer支持RTSP协议。

3、RTMP协议

RTMP全称Real Time Messaging Protocol,意思是实时消息传输协议,它是Adobe公司在零零年代提出的流媒体数据传输协议。

RTMP协议的直播地址形如rtmp://***,可通过RTMP传输的视频格式为H.264,音频格式为MP3或者AAC,音视频数据封装之后的文件格式为FLV或F4V。

RTMP协议的安全版本是RTMPS,也就是给RTMP协议增加了TLS/SSL支持。RTMPS采用安全套接字层 (SSL) 和传输层安全性 (TLS) 两种加密协议,使数据传输更加安全。

RTMP提出时间较早,最后一次更新时间在2012年,以至于未能支持HEVC和AV1等后期的音视频编码标准。又因为FLV格式没落已久,以至HTML5规范干脆移除了Flash插件,导致如今浏览器都不支持rtmp链接,连FFmpeg也迟至6.1版才给rtmp协议支持hevc格式。

不过好在RTMP的稳定性高,服务端的实现相对容易,并且之前的移动互联网爆发迅速,新的流媒体协议未能及时推出,使得RTMP协议被大量应用于网络直播领域。

在流媒体服务器中,MediaMTX、ZLMediaKit、SRS都支持RTMP协议。在直播软件中,电脑端的OBS Studio支持RTMP协议,手机端的RTMP Streamer和SRT Streamer都支持RTMP协议。

通过RTMP协议实现直播功能的说明参见之前的文章《利用RTMP协议构建电脑与手机的直播Demo》和《使用RTMP Streamer开启APP直播推流》。

4、HLS协议

HLS全称HTTP Live Streaming,意思是基于HTTP的流媒体传输协议,它是苹果公司于2009年提出的一种由于传输音视频的协议交互方式。

HLS采用HTTP协议传输音视频数据,访问地址形如“http://***.m3u8”。HLS协议通过将音视频流切割成TS切片及生成m3u8的播放列表文件,并通知客户端通过HTTP协议下载播放列表文件,按照列表文件中的顺序下载切片文件并播放,从而实现边下载边播放,类似于实时在线播放的效果。

由于HLS在传输层只采用HTTP协议,因此它具备HTTP协议的网络优势,比如很方便透过防火墙或者代理服务器,可简单的实现媒体流的负载均衡。因为HLS协议把视频流分片传输,使得在直播时延时较大,所以HLS更多用于视频点播领域。

关于HLS协议的更多说明参见之前的文章《分析SRS对HLS协议里TS包的插帧操作》和《解析H.264码流中的SPS帧和PPS帧》。

5、SRT协议

SRT全称Secure Reliable Transport,意思是安全可靠传输协议,它由由Haivision 和 Wowza共同创建的SRT联盟提出。

SRT协议协议的直播地址形如srt://***,它引入了AES加密算法,无需像RTSP和RTMP那样引入专门的SSL证书。作为较新的流媒体协议,SRT支持更多的音视频封装格式。只是该协议的支持库libsrt在2017年才开源,因此未能在移动互联网时代大量铺开,目前主要应用于大型电视直播领域。

FFmpeg从4.0开始支持集成第三方的libsrt库。在流媒体服务器中,MediaMTX、ZLMediaKit、SRS都支持SRT协议。在直播软件中,电脑端的OBS Studio从在25.0开始支持SRT协议,手机端的和SRT Streamer支持SRT协议,而RTMP Streamer不支持SRT协议,只有其升级版才支持SRT协议。

通过SRT协议实现直播功能的说明参见之前的文章《利用SRT协议构建手机APP的直播Demo》和《使用SRT Streamer开启APP直播推流》。

6、RIST协议

RTST全称Reliable Internet Stream Transport,意思是可信赖的互联网流媒体协议,它由2017年成立的RIST工作组提出。

RIST是一个在传输层使用UDP协议,并在应用层提供可靠性和流控制功能的流传输协议。它并不是一个纯粹的应用层协议,而是在传输层和应用层之间操作的协议。RIST和SRT具有相同的加密级别,都支持大容量流媒体和前向纠错功能。

RIST协议的制定时间比SRT还晚,虽然晚制定会多考虑新功能,比如RIST支持点到多点广播,而SRT不支持;但是晚制定拖累了各开源软件对RIST的支持力度,比如OBS Studio早在25.0开始支持SRT,迟至27.0才开始支持RIST,另一个直播录制软件RootEncoder已支持SRT尚未支持RIST,流媒体服务器MediaMTX已支持SRT尚未支持RIST。

FFmpeg从4.4开始支持集成第三方的librist库。在流媒体服务器中,MediaMTX、ZLMediaKit、SRS都不支持RIST协议。在直播软件中,电脑端的OBS Studio从在27.0开始支持SRT协议,手机端尚未有开源软件支持RIST协议。

总的来说,目前国内占据主要市场份额的直播协议仍是RTMP,不过拥有更好性能的SRT协议正在逐步迎头赶上,比如腾讯视频云、京东视频云等等就引入了SRT协议。有关直播系统的搭建说明参见之前的文章《从0开始搭建直播系统的开源软件架构》。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  3. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  6. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  7. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  8. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

  9. 树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统

    前言   树莓派也可以做商业应用,工业控制,其稳定性和可靠性已经得到了验证,故而工业控制,一些停车场等场景也有采用树莓派作为主控的,本片介绍了研华ADVANTECH的树莓派套件组UNO-220-P4N ...

  10. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

随机推荐

  1. 基于TI Sitara系列AM5728工业开发板——FPGA视频开发案例分享

    前 言 3 1 cameralink_display案例 4 1.1 案例功能 4 1.2 操作说明 4 1.3 关键代码(MicroBlaze) 11 1.4 Vivado工程说明 16 1.5 模 ...

  2. 「悬浮捷径SoftCircle」安卓平台的hao123,一键打开万物

    罗老师的onestep一步发布之前, 终端的打开形式还拘泥于桌面和负一屏 这种方式够简洁,但缺点明显: 1.入口单一性:只能在app首页和各种扫一扫之间选择和切换 2.操作复杂:入口切换需要频繁的进入 ...

  3. SDL3 入门(5):纹理渲染

    创建纹理 有三个 API 可以用来创建纹理: SDL_CreateTexture 参数少,使用方便,适用于创建简单的纹理 SDL_CreateTextureFromSurface 适用于从已有图像数据 ...

  4. 内部网关协议RIP

    RIP协议的特点:仅和相邻路由器交换信息:交换自己现在的路由表:按固定的时间周期. 对每一个相邻路由器发送的RIP报文,执行以下步骤: 1.对地址为x的相邻路由器发来的报文,修改此报文中的所有项目,把 ...

  5. CF709B 题解

    洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\) 个点,在一条数轴上,位置为 \(x_1,-,x_n\),你的位置为 \(p\) ...

  6. 七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接

    前言 本章节的主要内容是完善Blazor学生管理页面的编写和接口对接. 七天.NET 8 操作 SQLite 入门到实战详细教程 第一天 SQLite 简介 第二天 在 Windows 上配置 SQL ...

  7. ios的idp/iep证书的生成方法,无苹果电脑

    在这个多端开发的年代,出现了很多优秀的开发框架,比如hbuilder和uniapp等等.我们可以使用这些框架来开发APP,假如我们要打包ios的app,则需要一个idp/iep证书. 那么这个证书是如 ...

  8. Mysql将查询出的数值转换为中文显示case..when..then

    我们经常需要在数据库导出文件,可是导出某些字段时不是中文含义其它同事分不清.可以通过case..when..then根据一一对应的关系将值转成中文,再进行导出方便大家查阅. 1.正常sql未处理之前查 ...

  9. 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

    问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...

  10. opencv-python报错:fatal error: jpeglib.h: No such file or directory

    参考: https://blog.csdn.net/yang_xuexi/article/details/123303777 https://blog.csdn.net/u010835747/arti ...