11#include " ../XEngine_Hdr.h"
22
33static bool bRecord = false ;
4- static XHANDLE xhVideo = 0 ;
4+ static XHANDLE xhVideo = NULL ;
5+ static XHANDLE xhAudio = NULL ;
56static XHANDLE xhSound = NULL ;
67static XHANDLE xhScreen = NULL ;
78static XHANDLE xhPacket = NULL ;
89static XHANDLE xhAudioFifo = NULL ;
10+ static XNETHANDLE xhFilter = 0 ;
911
1012void XCALLBACK HTTPTask_TaskPost_CBVideo (uint8_t * ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo, XPVOID lParam)
1113{
@@ -19,19 +21,34 @@ void XCALLBACK HTTPTask_TaskPost_CBVideo(uint8_t* ptszAVBuffer, int nAVLen, AVCO
1921 }
2022 BaseLib_Memory_Free ((XPPPMEM)&ppSt_MSGBuffer, nListCount);
2123}
22- void XCALLBACK HTTPTask_TaskPost_CBAudio (uint8_t * ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo , XPVOID lParam)
24+ void XCALLBACK HTTPTask_TaskPost_CBAudio (AVCODEC_AUDIO_MSGBUFFER* pSt_MSGBuffer , XPVOID lParam)
2325{
24- if (AudioCodec_Help_FifoSend (xhAudioFifo, (LPCXSTR)ptszAVBuffer, nAVLen))
26+ int nListCount = 0 ;
27+ AVCODEC_AUDIO_MSGBUFFER** ppSt_MSGBuffer;
28+ AVFilter_Audio_Cvt (xhFilter, pSt_MSGBuffer, &ppSt_MSGBuffer, &nListCount);
29+ for (int i = 0 ; i < nListCount; i++)
2530 {
31+ AudioCodec_Help_FifoSend (xhAudioFifo, ppSt_MSGBuffer[i]);
2632 while (true )
2733 {
28- XBYTE tszAVBuffer[ 8192 ] = {};
29- if (!AudioCodec_Help_FifoRecv (xhAudioFifo, tszAVBuffer, &nAVLen ))
34+ AVCODEC_AUDIO_MSGBUFFER st_MSGBuffer = {};
35+ if (!AudioCodec_Help_FifoRecv (xhAudioFifo, &st_MSGBuffer ))
3036 {
3137 break ;
3238 }
39+ int nAudioCount = 0 ;
40+ AVCODEC_AUDIO_MSGBUFFER** ppSt_AudioBuffer;
41+ AudioCodec_Stream_EnCodec (xhAudio, &st_MSGBuffer, &ppSt_AudioBuffer, &nAudioCount);
42+ for (int j = 0 ; j < nAudioCount; j++)
43+ {
44+ AVFormat_Packet_StreamWrite (xhPacket, 1 , ppSt_AudioBuffer[j]->ptszMSGBuffer [0 ], ppSt_AudioBuffer[j]->nMSGLen [0 ], &ppSt_AudioBuffer[j]->st_TimeStamp );
45+ }
46+ AudioCodec_Stream_Free (&ppSt_AudioBuffer, nAudioCount);
47+ AudioCodec_Stream_FreeBuffer (&st_MSGBuffer);
3348 }
3449 }
50+ AudioCodec_Stream_Free (&ppSt_MSGBuffer, nListCount);
51+ AudioCodec_Stream_FreeBuffer (pSt_MSGBuffer);
3552}
3653
3754bool HTTPTask_TaskPost_BackService (LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType)
@@ -367,11 +384,32 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
367384 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,初始化音频采集器请求失败,错误码:%lX" ), lpszClientAddr, AVCollect_GetLastError ());
368385 return false ;
369386 }
370- #ifdef _MSC_BUILD
371- xhAudioFifo = AudioCodec_Help_FifoInit (ENUM_AVCODEC_AUDIO_SAMPLEFMT_S16, 2 );
372- #else
387+ AVCollect_Audio_GetInfo (xhSound, &st_AVInfo);
388+ AVFILTER_AUDIO_INFO st_AudioFilter = {};
389+ st_AudioFilter.nIndex = 0 ;
390+ st_AudioFilter.st_AudioInfo = st_AVInfo.st_AudioInfo ;
391+ AVCollect_Audio_GetTimeBase (xhSound, &st_AudioFilter.st_AudioTime );
392+ if (!AVFilter_Audio_Init (&xhFilter, _X (" aresample=44100,aformat=sample_fmts=fltp:channel_layouts=stereo" ), &st_AudioFilter))
393+ {
394+ st_HDRParam.nHttpCode = 400 ;
395+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
396+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
397+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,初始化音频滤镜失败,错误码:%lX" ), lpszClientAddr, AVFilter_GetLastError ());
398+ return false ;
399+ }
400+ st_AVInfo.st_AudioInfo .nSampleRate = 44100 ;
401+ st_AVInfo.st_AudioInfo .nSampleFmt = ENUM_AVCODEC_AUDIO_SAMPLEFMT_FLTP;
402+ st_AVInfo.st_AudioInfo .enAVCodec = ENUM_XENGINE_AVCODEC_AUDIO_TYPE_AAC;
403+ xhAudio = AudioCodec_Stream_EnInit (&st_AVInfo.st_AudioInfo );
404+ if (NULL == xhAudio)
405+ {
406+ st_HDRParam.nHttpCode = 400 ;
407+ HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
408+ XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
409+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" HTTP客户端:%s,初始化音频采集器请求失败,错误码:%lX" ), lpszClientAddr, AudioCodec_GetLastError ());
410+ return false ;
411+ }
373412 xhAudioFifo = AudioCodec_Help_FifoInit (ENUM_AVCODEC_AUDIO_SAMPLEFMT_FLTP, 2 );
374- #endif
375413 if (NULL == xhAudioFifo)
376414 {
377415 st_HDRParam.nHttpCode = 400 ;
@@ -381,8 +419,13 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
381419 return false ;
382420 }
383421 XHANDLE xhAudioCodec = NULL ;
384- AVCollect_Audio_GetAVCodec (xhSound , &xhAudioCodec);
422+ AudioCodec_Stream_GetAVCodec (xhAudio , &xhAudioCodec);
385423 AVFormat_Packet_StreamCreate (xhPacket, xhAudioCodec);
424+ // 使用了滤镜,需要单独设置
425+ AVCODEC_TIMEBASE st_TimeBase = {};
426+ st_TimeBase.nDen = 44100 ;
427+ st_TimeBase.nNum = 1 ;
428+ AVFormat_Packet_TimeBase (xhPacket, 1 , &st_TimeBase);
386429 BaseLib_Memory_FreeCStyle ((XPPMEM)&xhAudioCodec);
387430 }
388431 bRecord = true ;
@@ -396,21 +439,24 @@ bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer
396439 break ;
397440 case XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_BS_RECORDSTOP:
398441 {
399- if (bRecord)
400- {
401- AVCollect_Video_Destory (xhScreen);
402- AVCollect_Audio_Destory (xhSound);
442+ bRecord = false ;
403443
404- VideoCodec_Stream_Destroy (xhVideo );
405- AudioCodec_Help_FifoClose (xhAudioFifo );
444+ AVCollect_Video_Destory (xhScreen );
445+ AVCollect_Audio_Destory (xhSound );
406446
407- AVFormat_Packet_Stop (xhPacket);
408- xhScreen = NULL ;
409- xhSound = NULL ;
410- xhVideo = NULL ;
411- xhPacket = NULL ;
412- bRecord = false ;
413- }
447+ VideoCodec_Stream_Destroy (xhVideo);
448+ AudioCodec_Stream_Destroy (xhAudio);
449+ AudioCodec_Help_FifoClose (xhAudioFifo);
450+
451+ AVFilter_Audio_Destroy (xhFilter);
452+
453+ AVFormat_Packet_Stop (xhPacket);
454+ xhScreen = NULL ;
455+ xhSound = NULL ;
456+ xhVideo = NULL ;
457+ xhAudio = NULL ;
458+ xhPacket = NULL ;
459+
414460 HttpProtocol_Server_SendMsgEx (xhHTTPPacket, m_MemorySend.get (), &nSDLen, &st_HDRParam);
415461 XEngine_Network_Send (lpszClientAddr, m_MemorySend.get (), nSDLen);
416462 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" HTTP客户端:%s,停止屏幕录制推流请求成功" ), lpszClientAddr);
0 commit comments