@@ -6,18 +6,24 @@ static XHANDLE xhAudio = NULL;
66static XHANDLE xhSound = NULL ;
77static XHANDLE xhScreen = NULL ;
88static XHANDLE xhPacket = NULL ;
9- static XHANDLE xhFilter = 0 ;
9+ static XHANDLE xhFilter = NULL ;
10+ static XHANDLE xhScale = NULL ;
1011
1112void XCALLBACK HTTPTask_TaskPost_CBVideo (XHANDLE*** pppSt_AVBuffer, XPVOID lParam)
1213{
13- int nListCount = 0 ;
14- XHANDLE** ppSt_AVPacket;
15- VideoCodec_Stream_EnCodec (xhVideo, pppSt_AVBuffer, &ppSt_AVPacket, &nListCount);
16- for (int i = 0 ; i < nListCount; i++)
14+ XHANDLE** ppSt_AVFrame;
15+ if (VideoCodec_Help_ScaleConvert (xhScale, (*pppSt_AVBuffer)[0 ], &ppSt_AVFrame))
1716 {
18- AVFormat_Packet_StreamWrite (xhPacket, 0 , ppSt_AVPacket[i]);
17+ int nListCount = 0 ;
18+ XHANDLE** ppSt_AVPacket;
19+ VideoCodec_Stream_EnCodec (xhVideo, ppSt_AVFrame[0 ], &ppSt_AVPacket, &nListCount);
20+ for (int j = 0 ; j < nListCount; j++)
21+ {
22+ AVFormat_Packet_StreamWrite (xhPacket, 0 , ppSt_AVPacket[j]);
23+ }
24+ AVHelp_Memory_FreeAVList (&ppSt_AVPacket, nListCount);
1925 }
20- AVHelp_Memory_FreeAVList (&ppSt_AVPacket, nListCount );
26+ AVHelp_Memory_FreeAVList (&ppSt_AVFrame, 1 , false );
2127}
2228void XCALLBACK HTTPTask_TaskPost_CBAudio (XHANDLE*** pppSt_AVBuffer, XPVOID lParam)
2329{
@@ -61,6 +67,10 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
6167 XENGINE_AVRECORD st_AVRecord = {};
6268 if (!ModuleProtocol_Parse_AVRecord (lpszMsgBuffer, nMsgLen, &st_AVRecord))
6369 {
70+ st_HDRParam.nHttpCode = 400 ;
71+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
72+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
73+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,请求屏幕录制失败,解析协议失败,错误码:%lX" ), lpszClientAddr, ModuleProtocol_GetLastError ());
6474 return false ;
6575 }
6676 // 屏幕采集
@@ -98,6 +108,10 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
98108 // 初始化屏幕编码器
99109 XENGINE_PROTOCOL_AVINFO st_AVInfo = {};
100110 AVCollect_Video_GetInfo (xhScreen, &st_AVInfo);
111+
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);
113+
114+ st_AVInfo.st_VideoInfo .nFormat = 0 ;
101115 st_AVInfo.st_VideoInfo .enAVCodec = ENUM_XENGINE_AVCODEC_VIDEO_TYPE_H264;
102116 xhVideo = VideoCodec_Stream_EnInit (&st_AVInfo.st_VideoInfo );
103117 if (NULL == xhVideo)
@@ -111,6 +125,8 @@ bool HTTPTask_TaskPost_AVRecordStart(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuff
111125 VideoCodec_Stream_GetAVCodec (xhVideo, &xhVideoCodec);
112126 AVFormat_Packet_StreamCreate (xhPacket, xhVideoCodec);
113127 BaseLib_Memory_FreeCStyle ((XPPMEM)&xhVideoCodec);
128+ // 转换
129+
114130 // 启用音频
115131 if (_tcsxlen (st_AVRecord.tszAudioDevice ) > 0 )
116132 {
@@ -187,6 +203,7 @@ bool HTTPTask_TaskPost_AVRecordStop(LPCXSTR lpszClientAddr)
187203 AVFilter_Audio_Destroy (xhFilter);
188204
189205 AVFormat_Packet_Stop (xhPacket);
206+ VideoCodec_Help_ScaleUninit (xhScale);
190207 xhScreen = NULL ;
191208 xhSound = NULL ;
192209 xhVideo = NULL ;
0 commit comments