`
wooce
  • 浏览: 184809 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AMF3协议的C++封装

    博客分类:
  • C++
 
阅读更多

    新的页游采用AMF3协议作为通讯协议。 网上相当一部分人说找不到AMF3协议的C++实现,不过其实并非如此。

libamfx 只支持AMF0不支持AMF3

amf3cplusplus 是国人实现的,仅实现windows平台版本,支持除undefine/xmldoc/xml外其他AMF3数据类型。 可能在一些情况下能满足你的需求。

 

    但我要在unix/linux平台下用, 所以amf3cplusplus不能直接满足我的需求。 c++ rtmp server 里其实已有了AMF3协议的比较全面完善的实现, 不过对于只需要其中的AMF3协议解析部分的人,需要一些把适当的代码抽取出来的工作。 

我现在把我抽出来的代码 打包了一下共享出来, 可以帮助其他有需要的人省点功夫。代码采用cmake进行build管理。 

    其中的VBuffer.h 和VBuffer.cpp 是我加进去的, 不是c++ rtmp server里原来有的。  

VBuffer的特点是: 一个VBuffer对象可以attach(挂载)进外部其他地方分配的内存, 所以比较方便和各种网络库结合使用, 不过同一个VBuffer对象,要么只用于连续Read的功能,要么只用于连续Write的功能,若对同一个

VBuffer对象既Read又Write, 则可能会发生混乱。

而与之对比, CRTMPServer的 IOBuffer类(common\src\utils\buffering\iobuffer.h)则是个可同时写和读的缓冲区管理类。我不用它而改用VBuffer主要是因为VBuffer比较方便和其他网络库结合使用的原因。 总的来说c++ rtmp server的代码质量感觉比较高, 它的其他部分有时间也可以研究学习一下. 

    下面是我结合使用陈硕的muduo网络库 进行AMF3协议解析的一小段例子:

 

const static size_t kHeaderLen = sizeof(uint32_t)+sizeof(uint32_t);
void GateServer::onMessage(const muduo::net::TcpConnectionPtr& conn,
                                     muduo::net::Buffer* buf,
                                     muduo::Timestamp time)
  {
   while (buf->readableBytes() >= kHeaderLen)
     {
      	const void* data = buf->peek();
      	int32_t be32 = *static_cast<const uint32_t*>(data);
        const int32_t len = muduo::net::sockets::networkToHost32(be32);
        LOG_INFO << conn->name() << "cmd:" << muduo::net::sockets::networkToHost32(cmd) << "length:" << len <<"\n";
      	if (len > 65536 || len < 0)
      	{
        	LOG_ERROR << "Invalid length " << len;
        	conn->shutdown();
      	}
        else if (buf->readableBytes() >= len+kHeaderLen)
      	{
                buf->retrieve(kHeaderLen);
      		VBuffer msgbuf(const_cast<char *>(buf->peek()),len);
	        buf->retrieve(len);
      		//cout<<msgbuf.GetBuffer()<<msgbuf.GetSize()<<endl;
      		AMF3Serializer serializer;
      		Variant var;
      		serializer.Read(msgbuf,var);
      		......
      	}
        else{
                break;
        }
  }
}
分享到:
评论
4 楼 rainxy2012 2013-10-10  
[flash=200,200][url][img][list]
[*]
引用
[u][i][b][/b][/i][/u]
[/list][/img][/url][/flash]
3 楼 zengraoli 2012-12-19  
wangfengmsdn 写道
您好,我也想要个例子……可以提供一个基于该库的详细点的AMF封包序列化和反序列化过程的例子吗?

crtmpserver上面不就有例子么?
2 楼 wangfengmsdn 2012-11-26  
您好,我也想要个例子……可以提供一个基于该库的详细点的AMF封包序列化和反序列化过程的例子吗?
1 楼 evilshadow 2012-06-26  
hi,请问你可以提供一个基于该库的详细点的AMF封包序列化和反序列化过程的例子吗?

相关推荐

    socket+AMF3

    客户端可能是一个Flash应用,它使用AMF3来编码数据,将这些数据封装在socket的发送缓冲区中,发送到服务器。服务器端接收到数据后,会先解析AMF3编码的二进制流,还原出原始的命令或数据,然后执行相应的业务逻辑。 ...

    librtmp 封装类 VS 2015

    在Visual Studio 2015环境下对librtmp进行封装,可以让我们在C++项目中更方便地处理和发送H264和AAC编码的音视频数据。 首先,我们需要理解librtmp的基本操作步骤: 1. **初始化连接**:使用`RTMP_Alloc()`创建...

    RTMP封包协议以及程序

    开发者可能会使用C++或C#语言实现RTMP协议的解析和传输逻辑,创建能够与RTMP服务器交互的客户端应用。 在开发RTMP程序时,可能涉及的关键技术包括: - **AMF编码和解码**:AMF是Adobe的二进制数据表示格式,用于在...

    matlab中云滴代码-AMF:用于在线QoS预测的自适应矩阵分解

    matlab中云滴代码AMF 该存储库维护了对云服务的在线 QoS 预测的自适应矩阵分解方法的实现。 从我们的出版物中阅读有关该算法的更多信息: ...实现的,并进一步封装为一个 Python 包以供通用。 安装AMF包 下载

    videoSdk.zip

    2. 建立连接:与RTMP服务器建立连接,通常通过AMF(Action Message Format)协议发送命令消息。 3. 发送数据:将封装好的视频流数据发送到RTMP服务器,服务器会负责将数据分发给订阅的客户端。 在这个项目中,...

    rtmpdump-2.3.rar_rtmpdump-2.3_arm64

    3. **命令消息解析**:rtmpdump不仅要处理数据流,还需要理解控制命令,例如播放、停止、快进/快退等,这些都是通过AMF编码的命令消息实现的。 4. **文件输出**:rtmpdump能够将接收到的流媒体数据写入本地文件,...

    librtmp源代码+编译脚本+静态库.zip

    3. `AMF`模块:Action Message Format,用于封装RTMP协议中的数据,如命令消息和音频、视频数据。 4. `Chunk`模块:RTMP协议使用分块传输来提高效率,chunk模块处理数据的分块和重组。 5. `Utils`模块:包含各种...

    RTMP_3516av200_hisi_hi3516av200_hi3516_rtmp_RTMP_3516av200_源码.

    3. **数据流**:RTMP支持音频、视频数据的传输,通常使用FLV(Flash Video)格式封装。 4. **时间同步**:保持服务器和客户端之间的播放时间同步,以确保流媒体的连续性。 5. **错误处理和重传机制**:在网络不稳定...

    librtmp zlib openssl源码 编译方法 编译工具 编译好的librtmp.lib合集.zip

    librtmp支持基本的RTMP功能,如建立连接、发布/播放流、发送数据块以及处理AMF(Action Message Format)编码的数据。 【zlib】 zlib是一个广泛使用的压缩库,主要提供无损数据压缩和解压缩功能。在librtmp中,zlib...

    rtmpdump.zip

    1. **RTMP连接与握手**:rtmpdump能够处理RTMP协议中的连接建立过程,包括AMF(Action Message Format)编码的握手消息,这是与RTMP服务器交互的基础。 2. **流识别与控制**:它能解析RTMP流元数据,允许用户指定要...

Global site tag (gtag.js) - Google Analytics