当前位置: 代码迷 >> 综合 >> RTMP、HTTP-FLV、HLS
  详细解决方案

RTMP、HTTP-FLV、HLS

热度:35   发布时间:2023-11-26 20:20:45.0

网络直播中常见的三种协议:RTMP、HTTP-FLV、HLS

HTML5和FLASH

在讲着三种协议之前,需要提一下FLASH和HTML5

  • HTML5和FLASH都是播放器
  • RTMP、HTTP-FLV、HLS这三种直播协议需要具体的播放器的支持
  • 当今是HTML5的世界,支持FLASH播放器的协议逐渐被淘汰
  • 协议的出现顺序RTMP(FLASH)-------FLV(FLASH,支持http传输)-------HLS(H5)
    • RTMP是由FLASH支持的,视频封装格式为flv的传输协议
    • http-flv出现在RTMP之后,其发送的还是flv封装格式的音视频,但其可以在http上进行传输
    • 后来出现HLS支持h5
    • 这就是音视频协议由FLASH到H5播放器的过程
  • 音视频封装格式:flv和m3u8、ts

两端一服:流媒体服务中的双端关系

  • 推流
    • 得到原始的视频或者音频数据
    • 对音频和视频数据进行编码得到H264码流和ACC音频(编码压缩处理,硬编码:API,软编码:FFmpeg)
    • 对数据进行封装得到flv、ts、ps流
    • 使用HLS协议的时候加上这一步(HLS分段生成策略及m3u8索引文件)

    • 通过流上传到服务器
    • 服务器根据协议进行流分发
    • 推流协议:RTMP
  • 拉流(播放):
    • 根据协议类型,和服务器建立连接并接收数据
    • 首先解封装(flv、ts)得到H264视频和ACC音频
    • 解码,使用硬解码(API)或者软解码(FFmpeg)得到原始的视频和音频数据
    • 同步音视频数据
    • 播放音视频
    • 拉流协议:RTMP和HLS
  • HLS协议只能用在拉流端、RTMP可以用在推流端和拉流端
  • 流媒体服务器:中间服务器,协调通信双方

RTMP

  • 基于flash播放器
  • 对应的封装格式:flv
  • RTMP是一种数据传输协议,基于TCP,RTMP本身在应用层
  • 消息
    • RTMP中的基本数据单元:消息
    • 结构:
      • message type
        • 消息类型,共有十种,表示后面消息体里面携带了什么信息
        • 1-7协议控制,表示RTMP自身管理所需要的信息,不需要用户进行操作
        • 8音频,9视频
        • 15-20,用户控制指令,AMF编码的命令,用户和服务器之间的交互,播放、暂停等
      • payload length
        • 负载长度
      • time stamp
        • 时间戳
      • stream id
        • 消息所属流ID
      • message body
        • 上面这些信息构成了消息头,消息头和消息体构成了一条消息
  • 消息块
    • 在网络上传输时,消息需要被拆分成较小的数据块(chunk)才能在相应的网络上传输
    • 构成
      • chunk header
        • chunk basic header:标识本块
        • chunk message header:标识本块负载所属消息
        • extended timestamp:时间戳溢出时出现
      • chunk data
  • 消息分块
    • 在分块的过程中,消息负载部分(message body)被划分成固定大小(128位)的数据块(除了最后一个数据块),然后在数据块的头部加上消息头(chunk header)就得到了一个chunk
  • 数据传输过程:
    • 发送端将数据封装为消息,然后对消息分块,得到chunk
    • 在网络上发送chunk(TCP)
    • 对接收到的chunk进行整合,得到消息,解封装得到原始数据

HLS

  • 基于HTTP传输
  • 苹果提出的
  • 切片:服务端按照不同的码率将文件或者媒体流分成小片段进行传输,播放端根据自身的带宽情况和性能限制,在同一视频的不同码率的备用源中下载合适码率的文件进行播放
  • m3u8索引文件:找到不同码率的码流(在播放器寻找合适码率的码流时用到)
  • HLS和RTP:RTP基于UDP,HLS基于HTTP,因此HLS可以经过任何允许HTTP传输的防火墙或者代理服务器,穿透力很强
  • 劣势:慢,响应时间比较快,但是把时间都浪费在等待数据上了。延时10s,而RMTP延时为3s,因此对互动性有要求的直播采用RMTP
  • 格式解析
    • 网络协议 HTTP
      封装格式 TS、MEPG-2
      编码格式 视频H264、音频ACC、MP3
      索引文件 m3u8
  • 流程

    • 原始的视频和音频数据首先经过编码和封装得到打包好的码流

    • 在服务器上将码流变成HLS支持的编码格式和封装格式,根据不同码率生成不同文件,分别进行切片处理,得到m3u8索引文件

    • 发送到客户端之后,访问以及m3u8得到合适码率的音视频流

  • m3u8

    • m3u8存在二级索引

    • 一级索引

      • 里面记录了二级索引地址

      • 存放了不同码率的m3u8文件的下载地址

    • 二级索引

      • 记录了ts切片序列的下载地址

    • 客户端获取一级索引m3u8之后,根据自己的带宽,下载相应码率的二级索引文件,按照二级索引文件的切片顺序下载并播放ts文件序列。

HTTP-FLV

  • http-flv就是http+flv,将音视频封装成flv格式然后通过http协议进行传输
  • 是对RTMP的改进

比较

  • 推流端:RTMP,拉流端:RTMP和HLS
  • RTMP为什么比HLS快
    • 比较他们的速度一定是在拉流端
    • RTMP拉流抓包
    • 从握手结束到传送第一个视频数据需要700ms
    • HLS拉流抓包
    • 从获得m3u8索引到得到ts切片需要200ms
    • 可以看到HLS的响应速度要快于RTMP,但实际上HLS比RTMP的延时更长,这是为什么?
      • 190bb277b77f97d435a1c8c0507fafcf.png
      • HLS的延时主要来源于等数据的时间,媒体服务器需要等待一定数量的数据上传,才能对这些数据统一做切片处理。

 

 

 

  相关解决方案