根据自己一段时间对RTMP协议的研究,得出的心得。 1.建立握手信息。通过socekt建立握手,然后将客户端的信息发送给服务器,这些信息包含推向服务器的直播流信息(rtmp://192.168.1.10/dd),agent信息,pageurl信息等等。根据需要可以在adobe服务的日志文件中看到。 2.服务器与客户端连接成功后,服务器会发送给客户端一个连接(connect)成功的信息。这样就建立了一个完整的通路,实现了一个客户端登录到adobe服务器的操作。
3.开始直播。先往服务器上发送releaseStream消息,onFCPublish消息,然后再发送createStream消息。进行这些操作的目的是告诉服务器我要进行发布一个流的信息,类似于跟服务器提前打招呼。然后再将直播流推送到服务器上。
4.停止直播。往服务器上发送onFCUnpublish消息,然后再发送deleteStream消息。这些操作的目的是销毁之前的流信息,使服务器不向外发布直播信息。
bool SendReleaseStream(RTMP *r)
{
RTMPPacket packet;
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
char *enc;
packet.m_nChannel = 0x03;
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM;
packet.m_packetType = 0x14;
packet.m_nTimeStamp = 0;
packet.m_nInfoField2 = 0;
packet.m_hasAbsTimestamp = 0;
packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;
enc = packet.m_body;
enc = AMF_EncodeString(enc, pend, &av_releaseStream); //函数名称
enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes);
*enc++ = AMF_NULL;
enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
if (!enc)
return false;
packet.m_nBodySize = enc - packet.m_body;
return RTMP_SendPacket(r, &packet, false);
}
|