Skip to content

Commit 6c5b500

Browse files
committed
added:flv play with pre pull support
1 parent b3d11ff commit 6c5b500

File tree

6 files changed

+91
-72
lines changed

6 files changed

+91
-72
lines changed

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientGet.cpp

Lines changed: 76 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,55 @@
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+
}
1362
bool 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;

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientGet.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
// Purpose: 拉流任务处理函数
1111
// History:
1212
*********************************************************************/
13+
bool PullStream_ClientGet_FLVPlay(LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer);
1314
//任务处理相关函数,处理包的内容
1415
bool PullStream_ClientGet_Handle(LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr, int nListCount);

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_RTMPTask.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ XHTHREAD CALLBACK PushStream_RTMPTask_Thread(XPVOID lParam)
4848
}
4949
return 0;
5050
}
51-
bool PushStream_RTMPTask_Play(LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer)
51+
bool PushStream_RTMPTask_Play(LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer)
5252
{
5353
int nHLen = 0;
5454
int nPLen = 0;
@@ -212,7 +212,7 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
212212
ModuleSession_PushStream_SetAVInfo(lpszClientAddr, &st_AVInfo);
213213
BaseLib_Memory_Free((XPPPMEM)&st_RTMPData.ppSt_CMDProperty, st_RTMPData.nCount);
214214
//如果启用了预拉流
215-
XEngine_AVPacket_AVPrePlay(lpszClientAddr, ptszSDBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
215+
XEngine_AVPacket_AVPrePlay(lpszClientAddr, ptszSDBuffer, ptszRVBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
216216
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTMP推流端:%s,请求数据协议解析成功,数据列表个数:%d"), lpszClientAddr, st_RTMPData.nCount);
217217
}
218218
else if (XENGINE_STREAMMEDIA_RTMP_MSGTYPE_COMMAND == pSt_RTMPHdr->byTypeID)
@@ -455,7 +455,7 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
455455
//配置头
456456
if (bSMSFound)
457457
{
458-
PushStream_RTMPTask_Play(lpszClientAddr, tszPushAddr, ptszSDBuffer);
458+
PushStream_RTMPTask_Play(lpszClientAddr, tszPushAddr, ptszSDBuffer, ptszRVBuffer);
459459
}
460460
ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTMP);
461461
return true;

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_RTMPTask.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
//任务处理池,用来获取一个完整包
1414
XHTHREAD CALLBACK PushStream_RTMPTask_Thread(XPVOID lParam);
1515
//预处理封包
16-
bool PushStream_RTMPTask_Play(LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer);
16+
bool PushStream_RTMPTask_Play(LPCXSTR lpszClientAddr, LPCXSTR lpszPushAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer);
1717
//任务处理相关函数,处理包的内容
1818
bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen);

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_AVPacket.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ bool XEngine_AVPacket_AVSetTime(LPCXSTR lpszClientAddr, int nVideoParament, int
8080
}
8181
return true;
8282
}
83-
bool XEngine_AVPacket_AVPrePlay(LPCXSTR lpszClientAddr, XCHAR* ptszSDBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enPushType)
83+
bool XEngine_AVPacket_AVPrePlay(LPCXSTR lpszClientAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enPushType)
8484
{
8585
XCHAR tszSMSAddr[MAX_PATH] = {};
8686
ModuleSession_PushStream_GetAddrForAddr(lpszClientAddr, tszSMSAddr);
@@ -91,12 +91,17 @@ bool XEngine_AVPacket_AVPrePlay(LPCXSTR lpszClientAddr, XCHAR* ptszSDBuffer, ENU
9191
for (int i = 0; i < nListCount; i++)
9292
{
9393
//rtmp预拉流
94-
if (st_ServiceConfig.st_XPull.st_PullRtmp.bPrePull && ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP == enPushType)
94+
if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP == enPushType)
9595
{
9696
//判断客户端
97-
if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTMP == ppSt_PullList[i]->enStreamType)
97+
if (st_ServiceConfig.st_XPull.st_PullRtmp.bPrePull && ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_RTMP == ppSt_PullList[i]->enStreamType)
9898
{
99-
PushStream_RTMPTask_Play(ppSt_PullList[i]->tszClientAddr, lpszClientAddr, ptszSDBuffer);
99+
PushStream_RTMPTask_Play(ppSt_PullList[i]->tszClientAddr, lpszClientAddr, ptszSDBuffer, ptszRVBuffer);
100+
ModuleSession_PullStream_SetPushAddr(ppSt_PullList[i]->tszClientAddr, lpszClientAddr);
101+
}
102+
if (st_ServiceConfig.st_XPull.st_PullFlv.bPrePull && ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_FLV == ppSt_PullList[i]->enStreamType)
103+
{
104+
PullStream_ClientGet_FLVPlay(ppSt_PullList[i]->tszClientAddr, lpszClientAddr, ptszSDBuffer, ptszRVBuffer);
100105
ModuleSession_PullStream_SetPushAddr(ppSt_PullList[i]->tszClientAddr, lpszClientAddr);
101106
}
102107
}

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/XEngine_AVPacket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ typedef struct
2020
bool XEngine_AVPacket_AVCreate(LPCXSTR lpszClientAddr);
2121
bool XEngine_AVPacket_AVDelete(LPCXSTR lpszClientAddr);
2222
bool XEngine_AVPacket_AVSetTime(LPCXSTR lpszClientAddr, int nVideoParament, int nAudioParament);
23-
bool XEngine_AVPacket_AVPrePlay(LPCXSTR lpszClientAddr, XCHAR* ptszSDBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enPushType);
23+
bool XEngine_AVPacket_AVPrePlay(LPCXSTR lpszClientAddr, XCHAR* ptszSDBuffer, XCHAR* ptszRVBuffer, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enPushType);
2424
bool XEngine_AVPacket_AVHdr(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, XBYTE byAVType, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enClientType);
2525
bool XEngine_AVPacket_AVFrame(XCHAR* ptszSDBuffer, int* pInt_SDLen, XCHAR* ptszRVBuffer, int* pInt_RVLen, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, XBYTE byAVType);

0 commit comments

Comments
 (0)