33static bool bRecord = false ;
44static XHANDLE xhSound = NULL ;
55static XHANDLE xhScreen = NULL ;
6- static XHANDLE xhStream = NULL ;
6+ static XHANDLE xhPacket = NULL ;
77static XHANDLE xhAudioFifo = NULL ;
88
99void XCALLBACK HTTPTask_TaskPost_CBVideo (uint8_t * ptszAVBuffer, int nAVLen, AVCOLLECT_TIMEINFO* pSt_TimeInfo, XPVOID lParam)
1010{
11- if (!XClient_StreamPush_LiveVideo (xhStream, ptszAVBuffer, nAVLen))
12- {
13- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 屏幕采集器,推流编码失败,需要关闭推流服务,错误码:%lX" ), StreamClient_GetLastError ());
14- }
1511}
1612void XCALLBACK HTTPTask_TaskPost_CBAudio (uint8_t * ptszAVBuffer, int nAVLen, AVCOLLECT_TIMEINFO* pSt_TimeInfo, XPVOID lParam)
1713{
@@ -24,10 +20,6 @@ void XCALLBACK HTTPTask_TaskPost_CBAudio(uint8_t* ptszAVBuffer, int nAVLen, AVCO
2420 {
2521 break ;
2622 }
27- if (!XClient_StreamPush_LiveAudio (xhStream, tszAVBuffer, nAVLen))
28- {
29- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" 音频采集器,推流编码失败,需要关闭推流服务,错误码:%lX" ), StreamClient_GetLastError ());
30- }
3123 }
3224 }
3325}
@@ -298,8 +290,45 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
298290 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,因为已经在录制中了" ), lpszClientAddr);
299291 return false ;
300292 }
301- XENGINE_PROTOCOL_AVINFO st_AVInfo;
302- memset (&st_AVInfo, ' \0 ' , sizeof (XENGINE_PROTOCOL_AVINFO));
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+ }
304+ // 屏幕采集
305+ AVCOLLECT_SCREENINFO st_AVScreen;
306+ memset (&st_AVScreen, ' \0 ' , sizeof (AVCOLLECT_SCREENINFO));
307+
308+ st_AVScreen.nFrameRate = 24 ;
309+ st_AVScreen.nPosX = 0 ;
310+ st_AVScreen.nPosY = 0 ;
311+ _xstprintf (st_AVScreen.tszVideoSize , _X (" %s" ), _X (" 1920x1080" ));
312+ #ifdef _MSC_BUILD
313+ xhScreen = AVCollect_Video_Init (" gdigrab" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
314+ #elif __linux__
315+ xhScreen = AVCollect_Video_Init (" x11grab" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
316+ #else
317+ xhScreen = AVCollect_Video_Init (" avfoundation" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
318+ #endif
319+ if (NULL == xhScreen)
320+ {
321+ st_HDRParam.nHttpCode = 400 ;
322+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
323+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
324+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,屏幕采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
325+ return false ;
326+ }
327+ XHANDLE xhVideoCodec = NULL ;
328+ AVCollect_Video_GetAVCodec (xhScreen, &xhVideoCodec);
329+ AVCollect_Video_GetTimeBase (xhScreen, &st_VideoTime);
330+ AVFormat_Packet_StreamCreate (xhPacket, xhVideoCodec);
331+ AVFormat_Packet_TimeBase (xhPacket, 0 , &st_VideoTime);
303332 // 启用音频
304333 if (1 == nBSType)
305334 {
@@ -318,7 +347,11 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
318347 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,初始化音频采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
319348 return false ;
320349 }
350+ #ifdef _MSC_BUILD
321351 xhAudioFifo = AudioCodec_Help_FifoInit (ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16, 2 );
352+ #else
353+ xhAudioFifo = AudioCodec_Help_FifoInit (ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16, 2 );
354+ #endif
322355 if (NULL == xhAudioFifo)
323356 {
324357 st_HDRParam.nHttpCode = 400 ;
@@ -327,59 +360,17 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
327360 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,初始化音频采集器请求失败,错误码:%lX" ), lpszClientAddr, AudioCodec_GetLastError ());
328361 return false ;
329362 }
330- st_AVInfo.st_AudioInfo .bEnable = true ;
331- AVCollect_Audio_GetInfo (xhSound, &st_AVInfo);
332- // 音频编码参数
333- st_AVInfo.st_AudioInfo .enAVCodec = ENUM_XENGINE_AVCODEC_AUDIO_TYPE_AAC;
334- st_AVInfo.st_AudioInfo .nSampleFmt = ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16;
335- }
336- // 屏幕采集
337- AVCOLLECT_SCREENINFO st_AVScreen;
338- memset (&st_AVScreen, ' \0 ' , sizeof (AVCOLLECT_SCREENINFO));
339-
340- st_AVScreen.nFrameRate = 24 ;
341- st_AVScreen.nPosX = 0 ;
342- st_AVScreen.nPosY = 0 ;
343- _xstprintf (st_AVScreen.tszVideoSize , _X (" %s" ), _X (" 1920x1080" ));
344- #ifdef _MSC_BUILD
345- xhScreen = AVCollect_Video_Init (" gdigrab" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
346- #elif __linux__
347- xhScreen = AVCollect_Video_Init (" x11grab" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
348- #else
349- xhScreen = AVCollect_Video_Init (" avfoundation" , tszDstBuffer, &st_AVScreen, HTTPTask_TaskPost_CBVideo);
350- #endif
351- if (NULL == xhScreen)
352- {
353- st_HDRParam.nHttpCode = 400 ;
354- HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
355- XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
356- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,屏幕采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
357- return false ;
358- }
359- AVCollect_Video_GetInfo (xhScreen, &st_AVInfo);
360- st_AVInfo.st_VideoInfo .enAVCodec = ENUM_XENGINE_AVCODEC_VIDEO_TYPE_H264;
361- xhStream = XClient_StreamPush_LiveInit ();
362- if (NULL == xhStream)
363- {
364- st_HDRParam.nHttpCode = 400 ;
365- HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
366- XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
367- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,推流:%s 请求失败,错误码:%lX" ), lpszClientAddr, tszDstBuffer, StreamClient_GetLastError ());
368- return false ;
363+ XHANDLE xhAudioCodec = NULL ;
364+ AVCollect_Audio_GetAVCodec (xhSound, &xhAudioCodec);
365+ AVCollect_Audio_GetTimeBase (xhSound, &st_AudioTime);
366+ AVFormat_Packet_StreamCreate (xhPacket, xhAudioCodec);
367+ AVFormat_Packet_TimeBase (xhPacket, 1 , &st_AudioTime);
369368 }
370369 bRecord = true ;
371- XClient_StreamPush_LiveOutput (xhStream, tszAPIBuffer, _X (" flv" ));
372- XClient_StreamPush_LiveCreate (xhStream, &st_AVInfo);
373-
374- AVCODEC_TIMEBASE st_VideoTime = {};
375- AVCODEC_TIMEBASE st_AudioTime = {};
376- AVCollect_Audio_GetTimeBase (xhSound, &st_AudioTime);
377- AVCollect_Video_GetTimeBase (xhScreen, &st_VideoTime);
378- XClient_StreamPush_LiveTime (xhStream, &st_VideoTime, &st_AudioTime);
379370
371+ AVFormat_Packet_Start (xhPacket);
380372 AVCollect_Audio_Start (xhSound);
381373 AVCollect_Video_Start (xhScreen);
382- XClient_StreamPush_LiveWriteHdr (xhStream);
383374 HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
384375 XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
385376 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" HTTP客户端:%s,开始屏幕录制,音频:%s,视频:%s 推流:%s 请求成功" ), lpszClientAddr, tszSrcBuffer, tszDstBuffer, tszAPIBuffer);
@@ -391,10 +382,10 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
391382 {
392383 AVCollect_Video_Destory (xhScreen);
393384 AVCollect_Audio_Destory (xhSound);
394- XClient_StreamPush_LiveClose (xhStream );
385+ AVFormat_Packet_Stop (xhPacket );
395386 xhScreen = NULL ;
396387 xhSound = NULL ;
397- xhStream = NULL ;
388+ xhPacket = NULL ;
398389 bRecord = false ;
399390 }
400391 HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
0 commit comments