rtmp协议详解


原文链接: rtmp协议详解

音视频混合
flvmuxer/rtmp.c at master · rainfly123/flvmuxer

rtmp协议详解
rtmp协议详解_程序员JT的博客-CSDN博客

理解RTMP协议——握手连接_lightfish_zhang的博客-CSDN博客

rtmp信令格式 博客

深入理解rtmp(一)之开发环境搭建 - 掘金

librtmp usage - 简书

rtmpdump是开发用于RTMP流的工具箱,支持所有RTMP格式,具体包含如下:

3.1 HI3518+RTMP_运维_zhanshenrui的博客-CSDN博客

  • RTMP
  • RTMPE = RTMP + ENC,已加密的RTMP
  • RTMPS = RTMP + SSL,通过SSL传输层传输RTMP
  • RTMPT = RTMP + HTTP,在HTTP协议中传输RTMP
  • RTMPTE = RTMP + HTTP + ENC,在HTTP协议中传输已加密RTMP
  • RTMPTS = RTMP + HTTP + SSL,通过SSL传输层在HTTP协议中传输RTMP

源码下载
git clone git://git.ffmpeg.ort/rtmpdump

从v2.1开始,提供了两个额外的程序,rtmpsrv和rtmpsuck.

  • rtmpsrv是服务器的存根,它记录了来自客户端的请求的连接和播放参数。然后它会使用这些参数来调用rtmpdump以请求流。
  • rtmpsuck是一个透明代理,它会拦截来自客户端的连接并创建一个向外的连接至真实服务器。当所有握手完成且双端协商加密key完毕后,它会把所有服务器发给客户端的流数据以明文形式记录至文件。

librtmp Usage

librtmp是一组RTMP API,该组API中提供了大量的客户端函数以及小部分服务器函数,以支持RTMP、RTMPT、RTMPE、RTMPS、RTMPTE以及RTMPTS。虽然RTMP最基础的Spec已经由Adobe公司发布,不过本组API并未采用Adobe的Spec进行逆向开发。因此,本组API可能与已发布Spec有所出入,但通常是和其他Adobe客户端运行方式一致的。

1. 概述

RTMPDump软件包在rtmpdump中包含了一个基础客户端工具程序,一些服务器示例,以及一个支持编程访问RTMP协议的库。

基础交互过程如下:

  • RTMP_Alloc()创建会话句柄(session handle)
  • RTMP_Init()进行初始化
  • RTMP_SetupURL()提供所有会话参数
  • RTMP_Connect()建立网络连接
  • RTMP_ConnectStream()建立RTMP会话
  • RTMP_Read()读取流,如返回0字节,则流读取完毕
  • RTMP_Close()用于关闭流
  • RTMP_Free()用于释放会话句柄

  • 如需发布流,可在RTMP_Connect()前调用RTMP_EnableWrite(),然后在会话建立后使用使用RTMP_Write()
  • RTMP_Pause()在流播放过程中用于在暂停和播放状态间切换
  • RTMP_Seek()用于在流播放过程中移动位置

所有数据以FLV格式进行传输,基础会话需要提供RTMP URL。RTMP URL格式如下:

rtmp[t][e][s]://hostname[:port][/app[/playpath]]

如前所述,原始rtmp、协议或传输层包裹的及已加密会话均可支持。

额外的参数可通过在URL后添加以空格区隔的键值对(key=value)进行指定,需要注意的是含有特殊字符时要使用‘\HH(Hexadecimal)’格式,以免误导选项解释器(option parser),例如,空格需表示为'\20',反斜杠为'\5c'。

2. 选项

网络参数(Network)

参数定义如何连接至媒体服务器:

  • socks=host:port 使用指定的SOCKS4 proxy

连接参数(Connection)

选项定义了RTMP连接请求分组内容,如未提供正确值,媒体服务器将拒绝连接:

  • app=name RTMP服务器上希望连接的程序,会覆盖URL中包含的程序名。某些时候librtmp URL parser不能够智能决定app名称,所以可通过该参数进行指定

  • tcUrl=url 目标流的URL,默认为rtmp[t][e|s]://host[:port]/app

  • pageUrl=url 媒体被嵌入的网页URL,默认不设定任何值

  • swfUrl=url 用于媒体的SWF播放器,默认不设定任何值

  • flashVer=version 用于启动SWF播放器的Flash插件版本,默认为"LNX 10,0,32,18"

  • conn=type:data 在连接消息后添加任意AMF数据,类型必须为B(Boolean)/N(number)/S(string)/O(object)或Z(null)。对于Boolean类型,用0和1分别代表FALSE和TRUE;类似地对于Objects必须使用0或1来分别代表一个对象的结束和开始;子对象中的数据成员可能被命名,可在类型前加前缀‘N'并依次指定名称和值,如NB:myFlag:1。该选项可多次使用以构建各种AMF序列,如:

    conn=B:1 conn=S:authMe conn=0:1 conn=NN:code:1.23 conn=NS:flag:ok conn=0:0

3. 会话参数

这些选项将在连接请求成功后生效。

  • playpath=path 覆盖从RTMP URL中解析出来的playpath。有时候rtmpdump URL parser不能够正确地判断出正确的playpath,所以必须通过该选项进行显式指定
  • playlist=0/1 默认值为FALSE。如果值为1或TRUE,则在发送play命令前提交一个set_playlist命令。播放列表中会只包含当前playpath。如该值为0或FALSE,set_playlist命令不会被发送。
  • live=0/1 标明该媒体是一个live流,这意味着恢复和seeking操作都是不支持的
  • subscribe=path 订阅的live流名称,默认情况和playpath一致
  • start=num 从流的第几秒开始,live流不支持该参数
  • stop=num 在流的第几秒结束
  • buffer=num 设置buffer的大小,单位为ms,默认值为3000
  • timeout=num 设置会话超时时间,如num秒内未收到服务器端数据,则超时返回。默认为120s.

4. 安全参数

这些参数用于处理来自服务器端的额外的验证请求。

  • token=key SecureToken响应的Key,如server需要SecureToken验证时,将使用到该Key
  • jtv=JSON JSON token用于传统的Jstin.tv服务器,将调用NetStream.Authenticate.UsherToken
  • swfVfy=0/1 如该值为1或TRUE,SWF播放器将会从swfUrl指定路径获取以完成SWF确认。SWF的hash和size是自动计算完成的。同时SWF信息会被缓存到用户目录下的文件.swfinfo中,所以实际上不必每次接收后都进行重复计算。.swfinfo文件记录了SWF URL、fetch到的时间、SWF文件修改的时间戳、文件大小、以及hash代码。默认情况下,缓存信息会在重校验(re-checking)前的30天内有效
  • swfAge=days 指定重校验前缓存SWF信息的使用天数。设置为0时表示每次都要去校验SWF URL。注意如果校验结果显示SWF文件和之前的时间戳一致,不会再重复获取。
`