Skip to content

Commit 6401d17

Browse files
committed
modify:screen stream push support
1 parent 3398060 commit 6401d17

File tree

1 file changed

+41
-18
lines changed

1 file changed

+41
-18
lines changed

XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_BackService.cpp

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
#include "../XEngine_Hdr.h"
22

33
static bool bRecord = false;
4+
static XHANDLE xhVideo = 0;
45
static XHANDLE xhSound = NULL;
56
static XHANDLE xhScreen = NULL;
67
static XHANDLE xhPacket = NULL;
78
static XHANDLE xhAudioFifo = NULL;
89

910
void XCALLBACK HTTPTask_TaskPost_CBVideo(uint8_t* ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo, XPVOID lParam)
1011
{
12+
int nListCount = 0;
13+
AVCODEC_VIDEO_MSGBUFFER** ppSt_MSGBuffer;
14+
VideoCodec_Stream_EnCodec(xhVideo, ptszAVBuffer, nAVLen, &ppSt_MSGBuffer, &nListCount);
15+
for (int i = 0; i < nListCount; i++)
16+
{
17+
AVFormat_Packet_StreamWrite(xhPacket, 0, ppSt_MSGBuffer[i]->ptszAVBuffer, ppSt_MSGBuffer[i]->nAVLen, &ppSt_MSGBuffer[i]->st_TimeStamp);
18+
BaseLib_Memory_FreeCStyle((XPPMEM)&ppSt_MSGBuffer[i]->ptszAVBuffer);
19+
}
20+
BaseLib_Memory_Free((XPPPMEM)&ppSt_MSGBuffer, nListCount);
1121
}
1222
void XCALLBACK HTTPTask_TaskPost_CBAudio(uint8_t* ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo, XPVOID lParam)
1323
{
@@ -290,17 +300,6 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
290300
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求屏幕录制失败,因为已经在录制中了"), lpszClientAddr);
291301
return false;
292302
}
293-
AVCODEC_TIMEBASE st_VideoTime = {};
294-
AVCODEC_TIMEBASE st_AudioTime = {};
295-
xhPacket = AVFormat_Packet_Init();
296-
if (!AVFormat_Packet_Output(xhPacket, tszAPIBuffer, _X("flv")))
297-
{
298-
st_HDRParam.nHttpCode = 400;
299-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, m_MemorySend.get(), &nSDLen, &st_HDRParam);
300-
XEngine_Network_Send(lpszClientAddr, m_MemorySend.get(), nSDLen);
301-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求屏幕录制失败,推流服务端:%s 连接失败,错误码:%lX"), lpszClientAddr, tszAPIBuffer, AVFormat_GetLastError());
302-
return false;
303-
}
304303
//屏幕采集
305304
AVCOLLECT_SCREENINFO st_AVScreen;
306305
memset(&st_AVScreen, '\0', sizeof(AVCOLLECT_SCREENINFO));
@@ -324,11 +323,32 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
324323
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,屏幕采集器请求失败,错误码:%lX"), lpszClientAddr, AVCollect_GetLastError());
325324
return false;
326325
}
326+
xhPacket = AVFormat_Packet_Init();
327+
if (!AVFormat_Packet_Output(xhPacket, tszAPIBuffer, _X("flv")))
328+
{
329+
st_HDRParam.nHttpCode = 400;
330+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, m_MemorySend.get(), &nSDLen, &st_HDRParam);
331+
XEngine_Network_Send(lpszClientAddr, m_MemorySend.get(), nSDLen);
332+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求屏幕录制失败,推流服务端:%s 连接失败,错误码:%lX"), lpszClientAddr, tszAPIBuffer, AVFormat_GetLastError());
333+
return false;
334+
}
327335
XHANDLE xhVideoCodec = NULL;
328-
AVCollect_Video_GetAVCodec(xhScreen, &xhVideoCodec);
329-
AVCollect_Video_GetTimeBase(xhScreen, &st_VideoTime);
336+
//初始化屏幕编码器
337+
XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
338+
AVCollect_Video_GetInfo(xhScreen, &st_AVInfo);
339+
st_AVInfo.st_VideoInfo.enAVCodec = ENUM_XENGINE_AVCODEC_VIDEO_TYPE_H264;
340+
xhVideo = VideoCodec_Stream_EnInit(&st_AVInfo.st_VideoInfo);
341+
if (NULL == xhVideo)
342+
{
343+
st_HDRParam.nHttpCode = 500;
344+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, m_MemorySend.get(), &nSDLen, &st_HDRParam);
345+
XEngine_Network_Send(lpszClientAddr, m_MemorySend.get(), nSDLen);
346+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求屏幕录制失败,打开编码器视频编码器失败,错误码:%lX"), lpszClientAddr, VideoCodec_GetLastError());
347+
return false;
348+
}
349+
VideoCodec_Stream_GetAVCodec(xhVideo, &xhVideoCodec);
330350
AVFormat_Packet_StreamCreate(xhPacket, xhVideoCodec);
331-
AVFormat_Packet_TimeBase(xhPacket, 0, &st_VideoTime);
351+
BaseLib_Memory_FreeCStyle((XPPMEM)&xhVideoCodec);
332352
//启用音频
333353
if (1 == nBSType)
334354
{
@@ -350,7 +370,7 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
350370
#ifdef _MSC_BUILD
351371
xhAudioFifo = AudioCodec_Help_FifoInit(ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16, 2);
352372
#else
353-
xhAudioFifo = AudioCodec_Help_FifoInit(ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16, 2);
373+
xhAudioFifo = AudioCodec_Help_FifoInit(ENUM_AVCODEC_AUDIO_SAMPLEFMT_FLTP, 2);
354374
#endif
355375
if (NULL == xhAudioFifo)
356376
{
@@ -362,12 +382,10 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
362382
}
363383
XHANDLE xhAudioCodec = NULL;
364384
AVCollect_Audio_GetAVCodec(xhSound, &xhAudioCodec);
365-
AVCollect_Audio_GetTimeBase(xhSound, &st_AudioTime);
366385
AVFormat_Packet_StreamCreate(xhPacket, xhAudioCodec);
367-
AVFormat_Packet_TimeBase(xhPacket, 1, &st_AudioTime);
386+
BaseLib_Memory_FreeCStyle((XPPMEM)&xhAudioCodec);
368387
}
369388
bRecord = true;
370-
371389
AVFormat_Packet_Start(xhPacket);
372390
AVCollect_Audio_Start(xhSound);
373391
AVCollect_Video_Start(xhScreen);
@@ -382,9 +400,14 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
382400
{
383401
AVCollect_Video_Destory(xhScreen);
384402
AVCollect_Audio_Destory(xhSound);
403+
404+
VideoCodec_Stream_Destroy(xhVideo);
405+
AudioCodec_Help_FifoClose(xhAudioFifo);
406+
385407
AVFormat_Packet_Stop(xhPacket);
386408
xhScreen = NULL;
387409
xhSound = NULL;
410+
xhVideo = NULL;
388411
xhPacket = NULL;
389412
bRecord = false;
390413
}

0 commit comments

Comments
 (0)