1010// Purpose: 拉流任务处理函数
1111// History:
1212*********************************************************************/
13+ bool PullStream_ClientGet_FLVPlay (LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer)
14+ {
15+ int nRVLen = 0 ;
16+ int nSDLen = 0 ;
17+ XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
18+ // 拷贝头
19+ FLVProtocol_Packet_FrameHdr (lpszPushAddr, ptszRVBuffer, &nRVLen);
20+ nSDLen = _xstprintf (ptszSDBuffer, _X (" %x\r\n " ), nRVLen);
21+ memcpy (ptszSDBuffer + nSDLen, ptszRVBuffer, nRVLen);
22+ nSDLen += nRVLen;
23+ memcpy (ptszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
24+ nSDLen += 2 ;
25+ XEngine_Network_Send (lpszClientAddr, ptszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
26+ // 标签信息
27+ int nTagSize = 0 ;
28+ ModuleSession_PushStream_GetAVInfo (lpszPushAddr, &st_AVInfo);
29+ FLVProtocol_Packet_FrameScript (lpszPushAddr, ptszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
30+ nSDLen = _xstprintf (ptszSDBuffer, _X (" %x\r\n " ), nRVLen);
31+ memcpy (ptszSDBuffer + nSDLen, ptszRVBuffer, nRVLen);
32+ nSDLen += nRVLen;
33+ memcpy (ptszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
34+ nSDLen += 2 ;
35+ XEngine_Network_Send (lpszClientAddr, ptszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
36+ // 发送音视频信息
37+ if (st_AVInfo.st_VideoInfo .bEnable )
38+ {
39+ FLVProtocol_Packet_FrameAVCConfigure (lpszPushAddr, ptszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
40+ nSDLen = _xstprintf (ptszSDBuffer, _X (" %x\r\n " ), nRVLen);
41+ memcpy (ptszSDBuffer + nSDLen, ptszRVBuffer, nRVLen);
42+ nSDLen += nRVLen;
43+ memcpy (ptszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
44+ nSDLen += 2 ;
45+ XEngine_Network_Send (lpszClientAddr, ptszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
46+ }
47+
48+ if (st_AVInfo.st_AudioInfo .bEnable )
49+ {
50+ FLVProtocol_Packet_FrameAACConfigure (lpszPushAddr, ptszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
51+ nSDLen = _xstprintf (ptszSDBuffer, _X (" %x\r\n " ), nRVLen);
52+ memcpy (ptszSDBuffer + nSDLen, ptszRVBuffer, nRVLen);
53+ nSDLen += nRVLen;
54+ memcpy (ptszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
55+ nSDLen += 2 ;
56+ XEngine_Network_Send (lpszClientAddr, ptszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
57+ }
58+ ModuleSession_PullStream_FLVTagSet (lpszClientAddr, nTagSize);
59+ ModuleSession_PushStream_ClientInsert (lpszPushAddr, lpszClientAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_FLV);
60+ return true ;
61+ }
1362bool PullStream_ClientGet_Handle (LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr, int nListCount)
1463{
1564 int nRVLen = 0 ;
@@ -45,92 +94,55 @@ bool PullStream_ClientGet_Handle(LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr,
4594 memset (tszVluBuffer, ' \0 ' , sizeof (tszVluBuffer));
4695
4796 BaseLib_String_GetKeyValue ((*ppptszListHdr)[1 ], " =" , tszKeyBuffer, tszSMSAddr);
48-
49- if (!ModuleSession_PushStream_FindStream (tszSMSAddr, tszPushAddr))
50- {
51- ModuleProtocol_Packet_Comm (tszRVBuffer, &nRVLen, NULL , 404 , " not found" );
52- HttpProtocol_Server_SendMsgEx (xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
53- XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
54- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 拉流端:%s,请求拉流的URL参数不正确:%s,可能流不存在,错误:%lX" ), lpszClientAddr, tszVluBuffer, ModuleSession_GetLastError ());
55- return false ;
56- }
5797 memset (tszVluBuffer, ' \0 ' , sizeof (tszVluBuffer));
5898 BaseLib_String_GetKeyValue ((*ppptszListHdr)[2 ], " =" , tszKeyBuffer, tszVluBuffer);
5999
60100 ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enStreamType;
61101 if (0 == _tcsxnicmp (tszVluBuffer, " flv" , 3 ))
62102 {
63- if (!ModuleSession_PushStream_FindStream (tszSMSAddr, tszPushAddr))
103+ bool bSMSFound = false ;
104+ if (ModuleSession_PushStream_FindStream (tszSMSAddr, tszPushAddr))
64105 {
65- ModuleProtocol_Packet_Comm (tszRVBuffer, &nRVLen, NULL , 404 , " not found" );
66- HttpProtocol_Server_SendMsgEx (xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
67- XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
68- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 拉流端:%s,请求拉流的URL参数不正确:%s,可能流不存在,错误:%lX" ), lpszClientAddr, tszVluBuffer, ModuleSession_GetLastError ());
69- return false ;
106+ bSMSFound = true ;
107+ }
108+ else
109+ {
110+ if (!st_ServiceConfig.st_XPull .st_PullFlv .bPrePull )
111+ {
112+ ModuleProtocol_Packet_Comm (tszRVBuffer, &nRVLen, NULL , 404 , " not found" );
113+ HttpProtocol_Server_SendMsgEx (xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
114+ XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
115+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 拉流端:%s,请求拉流的URL参数不正确:%s,可能流不存在,错误:%lX" ), lpszClientAddr, tszVluBuffer, ModuleSession_GetLastError ());
116+ return false ;
117+ }
118+ bSMSFound = false ;
70119 }
71- int nTagSize = 0 ;
72120 enStreamType = ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_FLV;
73- // 拷贝数据
74- FLVProtocol_Packet_FrameHdr (tszPushAddr, tszRVBuffer, &nRVLen);
121+
75122 // 返回数据,为HTTP CHUNKED
76123 nSDLen = _xstprintf (tszSDBuffer, _X (" HTTP/1.1 200 OK\r\n "
77124 " Connection: Close\r\n "
78125 " Content-Type: video/x-flv\r\n "
79126 " Server: XEngine/%s\r\n "
80127 " Access-Control-Allow-Origin: *\r\n "
81128 " Access-Control-Allow-Credentials: true\r\n "
82- " Transfer-Encoding: chunked\r\n\r\n "
83- " %x\r\n " ), BaseLib_Version_XTypeStr (), nRVLen);
84- memcpy (tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
85- nSDLen += nRVLen;
86- memcpy (tszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
87- nSDLen += 2 ;
129+ " Transfer-Encoding: chunked\r\n\r\n " ), BaseLib_Version_XTypeStr ());
88130 XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
89- // 发送脚本信息
90- XENGINE_PROTOCOL_AVINFO st_AVInfo;
91-
92- memset (&st_AVInfo, ' \0 ' , sizeof (XENGINE_PROTOCOL_AVINFO));
93- memset (tszRVBuffer, ' \0 ' , sizeof (tszRVBuffer));
94- memset (tszSDBuffer, ' \0 ' , sizeof (tszSDBuffer));
95131
96- ModuleSession_PushStream_GetAVInfo (tszPushAddr, &st_AVInfo);
97- FLVProtocol_Packet_FrameScript (tszPushAddr, tszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
98- nSDLen = _xstprintf (tszSDBuffer, _X (" %x\r\n " ), nRVLen);
99- memcpy (tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
100- nSDLen += nRVLen;
101- memcpy (tszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
102- nSDLen += 2 ;
103- XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
104- // 发送音视频信息
105- if (st_AVInfo.st_VideoInfo .bEnable )
106- {
107- FLVProtocol_Packet_FrameAVCConfigure (tszPushAddr, tszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
108- nSDLen = _xstprintf (tszSDBuffer, _X (" %x\r\n " ), nRVLen);
109- memcpy (tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
110- nSDLen += nRVLen;
111- memcpy (tszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
112- nSDLen += 2 ;
113- XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
114- }
115-
116- if (st_AVInfo.st_AudioInfo .bEnable )
132+ ModuleSession_PullStream_Insert (lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
133+ if (bSMSFound)
117134 {
118- FLVProtocol_Packet_FrameAACConfigure (tszPushAddr, tszRVBuffer, &nRVLen, &st_AVInfo, &nTagSize);
119- nSDLen = _xstprintf (tszSDBuffer, _X (" %x\r\n " ), nRVLen);
120- memcpy (tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
121- nSDLen += nRVLen;
122- memcpy (tszSDBuffer + nSDLen, _X (" \r\n " ), 2 );
123- nSDLen += 2 ;
124- XEngine_Network_Send (lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
135+ PullStream_ClientGet_FLVPlay (lpszClientAddr, tszPushAddr, tszSDBuffer, tszRVBuffer);
125136 }
126-
127- ModuleSession_PullStream_Insert (lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
128- ModuleSession_PushStream_ClientInsert (tszPushAddr, lpszClientAddr, enStreamType);
129- ModuleSession_PullStream_FLVTagSet (lpszClientAddr, nTagSize);
130137 }
131138 else if (0 == _tcsxnicmp (tszVluBuffer, " xstream" , 7 ))
132139 {
133- if (!st_ServiceConfig.st_XPull .st_PullXStream .bPrePull )
140+ bool bSMSFound = false ;
141+ if (st_ServiceConfig.st_XPull .st_PullXStream .bPrePull )
142+ {
143+ bSMSFound = true ;
144+ }
145+ else
134146 {
135147 if (!ModuleSession_PushStream_FindStream (tszSMSAddr, tszPushAddr))
136148 {
@@ -140,6 +152,7 @@ bool PullStream_ClientGet_Handle(LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr,
140152 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 拉流端:%s,请求拉流的URL参数不正确:%s,可能流不存在,错误:%lX" ), lpszClientAddr, tszVluBuffer, ModuleSession_GetLastError ());
141153 return false ;
142154 }
155+ bSMSFound = false ;
143156 }
144157 enStreamType = ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_XSTREAM;
145158 XENGINE_PROTOCOL_AVINFO st_AVInfo;
0 commit comments