织梦CMS - 轻松建站从此开始!

罗索

利用RTMP协议进行直播的过程(C++)

落鹤生 发布于 2014-05-18 17:12 点击:次 
注意:在往服务器推送直播流的过程中,音频和视频使用不同的通道。上面提到的XXX消息,是根据RTMP自定义的协议规则去组成的,例如releaseStream消息的组成方式。
TAG: rtmp  librtmp  

根据自己一段时间对RTMP协议的研究,得出的心得。 1.建立握手信息。通过socekt建立握手,然后将客户端的信息发送给服务器,这些信息包含推向服务器的直播流信息(rtmp://192.168.1.10/dd),agent信息,pageurl信息等等。根据需要可以在adobe服务的日志文件中看到。

2.服务器与客户端连接成功后,服务器会发送给客户端一个连接(connect)成功的信息。这样就建立了一个完整的通路,实现了一个客户端登录到adobe服务器的操作。
3.开始直播。先往服务器上发送releaseStream消息,onFCPublish消息,然后再发送createStream消息。进行这些操作的目的是告诉服务器我要进行发布一个流的信息,类似于跟服务器提前打招呼。然后再将直播流推送到服务器上。
4.停止直播。往服务器上发送onFCUnpublish消息,然后再发送deleteStream消息。这些操作的目的是销毁之前的流信息,使服务器不向外发布直播信息。
 
注意:在往服务器推送直播流的过程中,音频和视频使用不同的通道。上面提到的XXX消息,是根据RTMP自定义的协议规则去组成的,例如releaseStream消息的组成方式。
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);
}
(菜菜)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201405/16976.html]
本文出处:新浪博客 作者:菜菜 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容