FMS RTMP协议

2024-02-01 06:32
文章标签 协议 rtmp fms

本文主要是介绍FMS RTMP协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、握手

FMS就是Flahs Media Server的缩写

要准备的一些工具有IDA、SoftIce、抓包工具(WSocket Expert)

IDA主要是用来做静态分析的,SoftIce主要是做动态分析,用抓包工具来抓收到和发送的网络数据

参考的代码有一个开源的FMS的代码,Java写的Red5

以上都准备好了就可以开始分析FMS的协议了,过程最好是先看看代码,然后静态分析,最后再用SoftIce做动态跟踪这样研究的速度就快多了。

(一)关于Flash Player和服务器端的握手

握手的过程是客户端向服务器端发送一个长度为600h长的数字签名的字符串到服务器端,然后服务器回应一个600h长的服务器端的数字签名字符串,连同客户端的数字签名一起回传给客户端,完成第一步的连接过程

客户端发送消息描述

struct connect_message{

byte header;//0×03

dword systemtime;//系统时间是用getsystemtime取到的

dword reserver;//都是零

byte* pcsign;//长度为600h的数字签名

} ;

服务器端发送消息描述

struct connect_message{

byte header;//0×03

dword systemtime;//系统时间是用getsystemtime取到的

dword reserver;//都是零

byte* pssign;//长度为600h的数字签名

byte* pcsign;//长度为600h的

} ;

这里通过分析发现生成数字签名的算法是用系统时间做一个种子,然后通过下面的运算计算出来的一个长度为600h的数字签名串运算的python脚本如下

def test():
const = 0xB8CD75
al = 0×87
for i in range(0,300):
if al > 127:
al = 256-al
al = -al
al = al*const
al += 1
else:
al = al*const
al += 1
if( al < 0 ):
al -= 1
al = al | 0xFFFFFF00
al += 1
al = al & 0xFF
print '%x' % (al & 0xFF)
else:
al = al & 0xFF
print '%x' % (al & 0xFF)

注意的是生成的一个字节添充到2*i的内存中所以这里一共要做300次循环就可以了

(二)客户端发起连接

用收到的服务器端的数字签名生成一个连接消息,然后把客户端的一些基本的消息发送给服务器端用来连接
struct connect_message{

byte* pssign;//长度为600h的数字签名

byte* message;//发送的消息数据
} ;

发送的消息数据参考red5中的消息代码(RTMPProtocolDecoder.java)

消息体大概的结构如下

struct message{

byte headsize : 2;//第一个字节的头两位

byte channelid : 6;//第一个字节的后6位

dword timer : 24; //三个字节表示的时间信息

dword long : 24;//三个字节表示的长度

byte datatype ://数据类型

dword streamid;//流标识

byte* data;//消息数据体

}

(三)服务器返回状态消息

服务器返回连接状态,连接握手结束

二、关于视频捕捉的协议

(一)概述
握手完成后下面要按照RTMP协议进行数据的传输,跟一般的协议相同一般数据流都由下以下的数据结构,[协议头][协议数据][消息数据]。
(二)协议头
协议头主要有两个结构组成
type : 2 (主要跟协议数据有关)
channel : 6 (参考red5表示channel)
(三)协议数据
type协议数据0(Protocol newstrean)timestamp : 24 (时间戳)bodysize : 24 (消息体长度)
datatype : 8 (数据类型)
stream_id : 32 (数据流标识)
1(Protocol samestream)timestamp : 24(时间戳)bodysize : 24 (消息体长度)
datatype : 8 (数据类型)
2(Protocol timechage)timestamp : 24(时间戳)3(Protocol continue)没有多余的数据(四)datatype的类型
主要参考red5中的类型说明
类型说明CHUNK_SIZE(0×01)
UNKNOW(0×02)
BYTES_READ(0×03)
PING(0×04)
SERVER_BANDWIDTH(0×05)服务器带宽(4字节)125000(125k)CLIENT_BANDWIDTH(0×06)客户端带宽(服务器端:5字节,最后一个应该是channel的值,客户端:4个字节)125000(125k)UNKNOW(0×07)
AUDIO_DATA(0×08)音频流数据VIDEO_DATA(0×09)视频流数据一般是一帧UNKNOW(0×0A)
UNKNOW(0×0B)
UNKNOW(0×0C)
UNKNOW(0×0D)
UNKNOW(0×0E)
UNKNOW(0×0F)
UNKNOW(0×10)
UNKNOW(0×11)
METADATA(0×12)
SHARED_OBJECT(0×13)
INVOKE(0×14)调用的脚本数据,包括一些参数和调用的AS脚本(五)视频捕捉协议流
首先参考上一篇技术文档,完成握手并发送相关的Invoke脚本后客户端(C),服务器端Server(S)
(1)(C)Recv以下几组数据
SERVER_BANDWIDTH(0×05)<=>CLIENT_BANDWIDTH(0×06)<=>PING(0×04)
(2)(C)Recv
PING(0×04)<=>还有上一步发送的Invoke数据的回调Invoke脚本确认成功后发送下面数据
(3)(C)Send
CLIENT_BANDWIDTH(0×06)一般直接返回服务器的建议值
(4)(C)Send
Invoke脚本(创建视频流对象)
(5)(C)Recv
Invoke脚本(创建视频流对象结果)
(6)(C)Send
Invoke脚本(创建视频流对象结果)
(7)C(Send)
Invoke脚本(Netstream的方法)
(8)C(Recv)
PING(0×04)<=>Invoke脚本(Netstream的方法调用的结果)(收到两个一个是Public.Start,一个是Record.Start)
(9)C(Send)
VIDEO_DATA(0×09)

三、Invoke数据流

(一)概述

invoke中使用大量的ActionScript中的数据类型或做为参数,或作为变量

(二)类型说明(参考Red5)

(1)String(字符串类型)=0×02

length : 2字节

string : length

(2)object(对像类型)=0×03

嵌套定义的基本类型

end : 1字节(0×09)

这篇关于FMS RTMP协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666355

相关文章

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

CRtmpServer转推流到Nginx Rtmp及SRS(SimpleRtmpServer)的经历

转自:http://blog.csdn.net/fengyily/article/details/42557841 本人一直用的是CRtmpServer服务,在CRtmpServer服务中根据自已的想法也加入了许多功能,如通过http接口来加载配置等,苦于不支持HLS,自已添加ts分片水平又有限,思来想去决定借助SimpleRtmpServer的HLS功能。说干就干,马上查找相关资源

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

RTMP流媒体服务器 crtmpserver

http://www.oschina.net/p/crtmpserver crtmpserver又称rtmpd是Evostream Media Server(www.evostream.com)的社区版本采用GPLV3授权 其主要作用为一个高性能的RTMP流媒体服务器,可以实现直播与点播功能多终端支持功能,在特定情况下是FMS的良好替代品。 支持RTMP的一堆协议(RT

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备