darwin代码心得
sunxiaopengsun
这个作者很懒,什么都没留下…
展开
-
darwin之推流协议详解
对于视频直播流传输来讲,RTMP和RTSP是常用的2种上行传输方式(这里暂时不讨论基于HTTP的Living方式),通常熟悉的应用方式是RTMP推流,RTSP拉流。但实际上,RTSP也是可以方便实现推流的,对于IPC而言,使用RTSP推流在不增加设备开发工作量的同时,可以方便快捷的解决NAT穿越问题,因此有必要详细介绍下RTSP推流的方法。RTSP推流的方法在协议中有清晰的规定,主要是转载 2017-12-08 11:46:52 · 1265 阅读 · 0 评论 -
darwin之sdp信息解读(SDPSourceInfo)
有专门的类去管理sdp信息(SDPSourceInfo)。在ReflectorSession类由ReflectorStream来管理一个rtsp的所有流(音视频流),因此需要通过sdp信息来创建每一路流。1.ReflectorSession与SDPSourceInfo是如何关联到一起的?对于推流模式:在DoAnnounce时,客户端会将sdp信息发送到服务器,服务器以map的形式将其保原创 2017-12-13 14:29:44 · 394 阅读 · 0 评论 -
sdp文件详细总结
一概述:SDP目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。SDP基本上在internet上工作。他定义了会话描述的统一格式,但并不定义多播地址的分配和SDP消息的传输,也不支持媒体编码方案的协商,这些功能均由下层传送协议完成。典型的会话传送协议包括:SAP(Session Announcement Protocol会话公告协议),SIP(Session Ini原创 2017-12-13 16:32:56 · 467 阅读 · 1 评论 -
darwin之socket与Task关联
要想让task与socket关联起来,从而让socket以task的方式工作。class HTTPSession : public HTTPSessionInterface;class RTSPSession : public RTSPSessionInterface;无论是HTTPSessionInterface还是RTSPSessionInterface,都派生于task,而内原创 2017-12-04 16:23:52 · 537 阅读 · 0 评论 -
darwin之socket消息处理性能问题研究
windows下darwin接收到socket消息如何处理?所有的socket消息入口只有一个线程,而且是单线程:void EventThread::Entry().这个线程不断地遍历所有注册到窗口的socket消息(每一个新的socket,注册到窗口的消息id不同).此处的单线程循环处理所有客户端的消息,是否能达到高性能,个人感觉不能(上百万客户端,仅仅靠单线程捕获消息) 。当消原创 2017-12-05 12:12:38 · 277 阅读 · 0 评论 -
darwin之发送和接受数据注意事项
darwin中发送和接收数据使用函数:发送和接受都是用的阻塞方式。发送数据:多数是用WSASend函数,在需要发送的时刻,直接将其发送即可。接收数据:在EventThread线程捕获到有可读的窗口消息后,taskThread线程池调用Run方法,在run方法中调用recv接收数据。 socket本身有一个send函数,这个函数只能一次发送一个缓冲区,这对于在发送大量数据的时原创 2017-12-05 15:49:52 · 277 阅读 · 0 评论 -
darwin之协议深入详解(RTSP/RTP/RTCP详解整理)
RTSP:实时流协议(Real Time Streaming Protocol) RTSP的请求主要有DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN、OPTIONS等,顾名思义可以知道起对话和控制作用,RTSP的对话过程中SETUP可以确定RTP/RTCP使用的端口,PLAY/PAUSE/TEARDOWN可以开始或者停止RTP的发送,等等。原创 2017-12-06 15:31:20 · 555 阅读 · 0 评论 -
darwin之发送数据流(ReflectorSession)
1.darwin如何管理推送的rtsp流?rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_streamReflectorSession与av_stream相关联 ,通过OSRefTable*sSessionMap来管理(key:av_stream,value:ReflectorSession)原创 2017-12-12 17:55:22 · 431 阅读 · 0 评论 -
darwin之rtsp请求信息解析(RTSPRequest)
class RTSPRequest : public RTSPRequestInterface;class RTSPRequestInterface : public QTSSDictionary;RTSPRequest是QTSS_OBJECT,其派剩余QTSSDictionary。内部维护了很多关于rtsp请求的属性。当接收到客户端发送来的数据时,通过RTSPRequest来原创 2017-12-15 17:39:45 · 622 阅读 · 0 评论 -
darwin之ClientSession
1.ClientSession何物?rtsp客户端,从rtsp服务器上获取rtp流。class ClientSession : public Task派生于task,同时内部关联了一个socket。2.如何获取数据SInt64 ClientSession::Run()用来接收所有的rtsp消息:在Run中,类似于状态机的形式运行。在构造函数中初始话状态机的值。原创 2017-12-25 14:33:25 · 597 阅读 · 0 评论 -
darwin之task线程分类
darwin内部Task线程池内的线程分成2种类型:BlockingTaskThread(网络消息处理线程),ShortTaskThread(内部任务处理线程),这两类线程总和作为线程池内部总线程数。BlockingTaskThread处理具体的网络事件,从整个读取、解析、到处理、响应,必须完整执行完成之后,当前这个BlockingTaskThread才可能会执行下一个Socket的网络事件。原创 2017-12-07 17:35:04 · 338 阅读 · 0 评论 -
darwin之RTP协议分析(转载)
源地址;点击打开链接第1章. RTP概述1.1. RTP是什么RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP(Real-time Trans转载 2017-12-08 09:38:53 · 297 阅读 · 1 评论 -
darwin之如何判断udp及端口号或tcp及通道号
点击打开链接原创 2017-12-26 11:03:12 · 536 阅读 · 0 评论 -
darwin之RTPSession
1.RTPSession何时创建?RTPSession与RTSPSession类似,只要有一个客户端,则对应一个RTSPSession和RTPSession.CreateNewRTPSession在rtsp客户端发送describe(拉流)或者Announce(推流)的时候创建.一个客户端只对应一个RTSPSession和RTPSession.原创 2017-12-17 17:34:18 · 426 阅读 · 0 评论 -
darwin之流处理(ReflectorStream)
1.ReflectorStream与rtsp流的关系?负责一路流的处理:如果一个rtsp流有音视频2路流,那么每一路都需要一个ReflectorStream(在ReflectorSession通过SDPSourceInfo创建)。2.ReflectorStream负责维护所有rtp客户端。对一路流的转发:因为同时可能有多个客户端请求这路流,通过一个二维数组(Bucket*fOu原创 2017-12-14 10:34:46 · 427 阅读 · 0 评论 -
darwin之发送rtp包流程
1.重识ReflectStreamReflectStream负责rtsp中的一路流反射,负责一路流的 rtcp,rtp两种数据包的接收和发送 。UDPSocketPair管理rtp,rtcp包数据源 :fSocketA负责接收 rtp包 ,fSocketB接收 rtcp包。ReflectorSender负责发送数据包: fRTPSender负责发送rtp包,fRTCPSender负责发原创 2017-12-18 16:47:04 · 506 阅读 · 0 评论 -
H264的RTP负载打包的数据包格式,分组,分片
H264的RTP负载打包的数据包格式,分组,分片 1. RTP数据包格式RTP报文头格式(见RFC3550 Page12): 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 12 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+原创 2018-01-03 12:12:58 · 317 阅读 · 0 评论 -
darwin之socket消息获取与处理
关于监听socket消息其实就用了2个函数:select_watchevent(select_modwatch):socket注册窗口消息(类型req->er_data)select_waitevent:当窗口消息发生后,获取窗口消息。如果还想继续获取该socket其他消息,则需要重新调用select_watchevent注册。在windows下,Event原创 2017-12-04 14:29:53 · 494 阅读 · 0 评论 -
darwin之拉流模块实现
darwin已经实现了推流功能:客户端以rtsp协议的形式推送rtp包到darwin服务器,内部通过QTSSReflectorModule模块将流反射给所有的rtsp客户端。缺陷:1:麻烦:需要代码实现推流软件,在推流软件内部拉取网络流,再以rtsp协议推送到darwin上 2.:延迟大:原始流被转发了2次:推流软件内部转发一次,darwin服务器内部转发一次。基于原创 2017-12-13 09:47:17 · 484 阅读 · 0 评论 -
darwin之数据包管理
在darwin中,包含了两种类型的包:rtp和rtcp,他们都是通过ReflectorPacket类来管理的 。ReflectorPacket对象管理一个数据包,该数据包在堆栈中分配 ,大小为2060字节,所有的rtp,rtcp数据包最大大小都不能超过这个值。原创 2017-12-20 10:38:29 · 408 阅读 · 0 评论 -
darwin之解析字符串
StringParser 可以解析传进去的字符串,得到想要的字符原创 2017-12-08 15:43:36 · 171 阅读 · 0 评论 -
darwin之RTSPSession Run的状态机流程
今天详细的看了下RTSPSession的会话处理代码,该模块主要是Run方法内对会话的状态机进行管理,实现对RTSP会话的处理,我以点播Movie文件夹下的视频文件为例,深入的学习了(Describe、Setup、Play的点播流程),并按照状态机的处理顺序对他们进行一一解析,如下:【转载请注明出处】:http://blog.csdn.net/longlong5301. 状态机原创 2017-12-08 16:05:37 · 567 阅读 · 0 评论 -
Darwin之接收rtsp客户端数据(RTSPRequestStream)
当EventThread发现有网络数据后,会调用RTSPSession::Run(),而在此函数中如何接收客户端的数据呢?由RTSPRequestStream类负责接受rtsp客户端发送来的数据。作为rtsp客户端,会发送两种类型的数据:1.rtsp协议命令(信令消息:OPTION DESCRIBE SETUP PLAY ANNOUNCE),以\r\n\r\n作为结尾。2.rt原创 2017-12-08 17:14:20 · 563 阅读 · 0 评论 -
darwin之角色管理
在RTSPSession中,创建 QTSS_RoleParams fRoleParams变量,该变量(联合体)用来赋值模块的角色参数.在RTSPSession中,使用联合体中fRoleParams.rtspRequestParams来设置rtsp角色参数调用模块方法: (void)theModule->CallDispatch(QTSS_RTSPPreProcessor_原创 2017-12-10 12:11:38 · 342 阅读 · 0 评论 -
darwin之枚举值得组合使用(Task)
kAlive = 0x80000000, 二进制:1000 0000 0000 0000 0000 0000 0000 0000 kAliveOff = 0x7fffffff 二进制:0111 1111 1111 1111 1111 1111 1111 1111枚举的‘高级用法’组合运用:例如一个界面里有:增、删、查、改等操作,但对应不同用户就有不同操作权限。例如A用户原创 2017-12-01 15:56:08 · 220 阅读 · 0 评论 -
Dictionary数据类型在Darwin视频服务器中的使用
让我们先来看看Wikipedia中叫做Associative array的词条,是如下解释的:An associative array (also associative container , map , mapping , dictionary , finite map , and in query-processing an index or index file ) is an原创 2017-02-06 15:49:09 · 560 阅读 · 0 评论 -
darwin之数据包管理
在darwin中,不管是rtp包还是rtcp包,都是用ReflectorPacket来管理的。ReflectPackets负责发送数据包:遍历所有客户端,依次发送(每个客户端都会遍历队列中所有没发送的包,尽全力全部发送)。每次发送完毕后,开始删除过期包。原创 2017-12-19 18:24:07 · 300 阅读 · 0 评论 -
darwin之复制字符串(Task)
复制字符串用strncpy,该函数最后一个参数大小:整个内存最大大小,再所有复制操作结束后,将内存最后一个字节复制为\0,防止复制过程中因原字符串太长将整个内存全部覆盖。原创 2017-12-01 15:05:14 · 214 阅读 · 0 评论 -
darwin之一万个定时器实现(IdleTask)
class CTimeoutTask :public IdleTask;每个CTimeoutTask 相当于一个定时器.SetIdleTimer设置定时期触发时间,CancelTimeout取消定时期,注意idleTask只run一次,重复run多次需要多次调用 SetIdleTimer。原创 2017-12-02 18:43:06 · 492 阅读 · 0 评论 -
darwin之n秒内无流判断(timeoutTask)
class CRecStream : public Task{private: TimeoutTask m_TimeoutTask; int m_nTimeOutSec;public: void PullStream() { m_TimeoutTask.RefreshTimeout(); } CRecStream(int nTimeoutSec):m_Tim原创 2017-12-03 17:22:01 · 392 阅读 · 0 评论 -
darwin之回调
在darwin中定义了一个全局变量(结构体)sCallbacks,而这个结构体只有一个成员addr(数组),addr的每一个元素代表一个回调指针.QTSS_Callbacks QTSServer::sCallbacks;typedef struct { // Callback function pointer array QTSS_CallbackProcPtr原创 2017-12-10 21:07:53 · 290 阅读 · 0 评论 -
darwin之qtss属性详解
1.QTSSDictionary如何存储多个属性属性信息存放在DictValueElement结构体中,QTSSDictionary初始化包含QTSS_MAX_ATTRIBUTE_NUMS个结构体(DictValueElement)数组。原创 2017-12-12 10:46:52 · 466 阅读 · 0 评论 -
darwin之结构体中定义宏
结构体中定义宏。第一次看见在结构体中有宏定义,开始有点迷糊,想到该结构是如何存储的?宏定义会是不会多次编译?以下是我看的一个列子: struct ACL_XML { /* public */ int depth; /** int node_cnt; /**原创 2017-12-04 10:14:35 · 470 阅读 · 0 评论 -
darwin拉模式设计详解
1.live555客户端source sink创建流程rtp rtcp socket是在收到sdp信息(describe)后,根据sdp信息中的m信息来创建;source也是在收到sdp信息(describe)后,根据sdp中的媒体信息,来创建具体的source类型.在收到setup信息后,创建sink,对应source的sink2.darwin如何获取sdp信息通原创 2017-05-02 15:46:57 · 578 阅读 · 0 评论 -
darwin之OSRefTable使用
在OSRefTable里面可以管理map(一组键值对),(key)键是一个唯一的字符串,而(value)值可以是任何类型。而key,value通过OSRef来设置,OSRefTable只需要管理OSRef即可。OSRefTable可以在多个线程中处理而不需要加锁,因为其内部维护了锁。fRefTable.Register注册元素。OSRef* ref = fRefTable.Reso原创 2017-12-04 13:53:18 · 345 阅读 · 0 评论 -
基于easydarwin实现拉流转发功能
无论是darwin还是经过优化后的easydarwin流媒体服务器,都只支持客户端推流后转发。而我要实现的是,在此基础上,能够拉取rtsp流将其转发。1.为什么要实现这样的功能?现有一个摄像头,支持输出rtsp流。而客户的需求是想获取这个rtsp流,并且有上百个客户端同时获取:比如有的客户端想观看直播,有的想录制,而且要求延迟在几百ms以内。此类的需求,无论是darwin或者是easydarwin...原创 2018-02-10 13:31:26 · 6169 阅读 · 0 评论