@@ -63,8 +63,9 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
6363 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,因为已经在录制中了" ), lpszClientAddr);
6464 return false ;
6565 }
66-
6766 XENGINE_AVRECORD st_AVRecord = {};
67+ XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
68+
6869 if (!ModuleProtocol_Parse_AVRecord (lpszMsgBuffer, nMsgLen, &st_AVRecord))
6970 {
7071 st_HDRParam.nHttpCode = 400 ;
@@ -73,28 +74,6 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
7374 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,解析协议失败,错误码:%lX" ), lpszClientAddr, ModuleProtocol_GetLastError ());
7475 return false ;
7576 }
76- // 屏幕采集
77- AVCOLLECT_SCREENINFO st_AVScreen = {};
78-
79- st_AVScreen.nFrameRate = 24 ;
80- st_AVScreen.nPosX = 0 ;
81- st_AVScreen.nPosY = 0 ;
82- _xstprintf (st_AVScreen.tszVideoSize , _X (" %s" ), st_AVRecord.tszRsolution );
83- #ifdef _MSC_BUILD
84- xhScreen = AVCollect_Video_Init (" gdigrab" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
85- #elif __linux__
86- xhScreen = AVCollect_Video_Init (" x11grab" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
87- #else
88- xhScreen = AVCollect_Video_Init (" avfoundation" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
89- #endif
90- if (NULL == xhScreen)
91- {
92- st_HDRParam.nHttpCode = 400 ;
93- HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
94- XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
95- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,屏幕采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
96- return false ;
97- }
9877 xhPacket = AVFormat_Packet_Init ();
9978 if (!AVFormat_Packet_Output (xhPacket, st_AVRecord.tszFilePath , _X (" flv" )))
10079 {
@@ -104,29 +83,51 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
10483 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,推流服务端:%s 连接失败,错误码:%lX" ), lpszClientAddr, st_AVRecord.tszFilePath , AVFormat_GetLastError ());
10584 return false ;
10685 }
107- XHANDLE xhVideoCodec = NULL ;
108- // 初始化屏幕编码器
109- XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
110- AVCollect_Video_GetInfo (xhScreen, &st_AVInfo);
86+ // 屏幕采集
87+ if (_tcsxlen (st_AVRecord.tszVideoDevice ) > 0 )
88+ {
89+ AVCOLLECT_SCREENINFO st_AVScreen = {};
90+
91+ st_AVScreen.nFrameRate = 24 ;
92+ st_AVScreen.nPosX = 0 ;
93+ st_AVScreen.nPosY = 0 ;
94+ _xstprintf (st_AVScreen.tszVideoSize , _X (" %s" ), st_AVRecord.tszRsolution );
95+ #ifdef _MSC_BUILD
96+ xhScreen = AVCollect_Video_Init (" gdigrab" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
97+ #elif __linux__
98+ xhScreen = AVCollect_Video_Init (" x11grab" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
99+ #else
100+ xhScreen = AVCollect_Video_Init (" avfoundation" , st_AVRecord.tszVideoDevice , &st_AVScreen, HTTPTask_TaskPost_CBVideo);
101+ #endif
102+ if (NULL == xhScreen)
103+ {
104+ st_HDRParam.nHttpCode = 400 ;
105+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
106+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
107+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,屏幕采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
108+ return false ;
109+ }
110+ XHANDLE xhVideoCodec = NULL ;
111+ // 初始化屏幕编码器
112+ AVCollect_Video_GetInfo (xhScreen, &st_AVInfo);
111113
112- xhScale = VideoCodec_Help_ScaleInit (st_AVInfo.st_VideoInfo .nWidth , st_AVInfo.st_VideoInfo .nHeight , st_AVInfo.st_VideoInfo .nFormat , st_AVInfo.st_VideoInfo .nWidth , st_AVInfo.st_VideoInfo .nHeight , ENUM_AVCODEC_VIDEO_SAMPLEFMT_YUV420P);
114+ xhScale = VideoCodec_Help_ScaleInit (st_AVInfo.st_VideoInfo .nWidth , st_AVInfo.st_VideoInfo .nHeight , st_AVInfo.st_VideoInfo .nFormat , st_AVInfo.st_VideoInfo .nWidth , st_AVInfo.st_VideoInfo .nHeight , ENUM_AVCODEC_VIDEO_SAMPLEFMT_YUV420P);
113115
114- st_AVInfo.st_VideoInfo .nFormat = 0 ;
115- st_AVInfo.st_VideoInfo .enAVCodec = ENUM_XENGINE_AVCODEC_VIDEO_TYPE_H264;
116- xhVideo = VideoCodec_Stream_EnInit (&st_AVInfo.st_VideoInfo );
117- if (NULL == xhVideo)
118- {
119- st_HDRParam.nHttpCode = 500 ;
120- HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
121- XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
122- XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,打开编码器视频编码器失败,错误码:%lX" ), lpszClientAddr, VideoCodec_GetLastError ());
123- return false ;
116+ st_AVInfo.st_VideoInfo .nFormat = 0 ;
117+ st_AVInfo.st_VideoInfo .enAVCodec = ENUM_XENGINE_AVCODEC_VIDEO_TYPE_H264;
118+ xhVideo = VideoCodec_Stream_EnInit (&st_AVInfo.st_VideoInfo );
119+ if (NULL == xhVideo)
120+ {
121+ st_HDRParam.nHttpCode = 500 ;
122+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
123+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
124+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,打开编码器视频编码器失败,错误码:%lX" ), lpszClientAddr, VideoCodec_GetLastError ());
125+ return false ;
126+ }
127+ VideoCodec_Stream_GetAVCodec (xhVideo, &xhVideoCodec);
128+ AVFormat_Packet_StreamCreate (xhPacket, xhVideoCodec);
129+ BaseLib_Memory_FreeCStyle ((XPPMEM)&xhVideoCodec);
124130 }
125- VideoCodec_Stream_GetAVCodec (xhVideo, &xhVideoCodec);
126- AVFormat_Packet_StreamCreate (xhPacket, xhVideoCodec);
127- BaseLib_Memory_FreeCStyle ((XPPMEM)&xhVideoCodec);
128- // 转换
129-
130131 // 启用音频
131132 if (_tcsxlen (st_AVRecord.tszAudioDevice ) > 0 )
132133 {
0 commit comments