11#include " ../XEngine_Hdr.h"
22
33static bool bRecord = false ;
4+ static XHANDLE xhVideo = 0 ;
45static XHANDLE xhSound = NULL ;
56static XHANDLE xhScreen = NULL ;
67static XHANDLE xhPacket = NULL ;
78static XHANDLE xhAudioFifo = NULL ;
89
910void 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}
1222void 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