Skip to content

Commit 00b02d0

Browse files
committed
modify:system sound capture support for back service
1 parent 6401d17 commit 00b02d0

File tree

4 files changed

+75
-27
lines changed

4 files changed

+75
-27
lines changed

XEngine_Source/XEngine_ModuleProtocol/pch.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
#include <XEngine_Include/XEngine_NetHelp/APIAddr_Define.h>
3131
#include <XEngine_Include/XEngine_NetHelp/APIAddr_Error.h>
3232
#include <XEngine_Include/XEngine_SystemSdk/ProcFile_Define.h>
33-
#include <XEngine_Include/XEngine_AVCodec/AVCollect_Define.h>
3433
#include <XEngine_Include/XEngine_AVCodec/VideoCodec_Define.h>
3534
#include <XEngine_Include/XEngine_AVCodec/AVHelp_Define.h>
3635
#include "../XEngine_DependLibrary/XEngine_IPMacData/XEngine_Source/XIPMac_CommHdr.h"

XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,18 @@ using namespace std;
5555
#include <XEngine_Include/XEngine_RfcComponents/DNSProtocol_Error.h>
5656
#include <XEngine_Include/XEngine_SystemSdk/SystemApi_Define.h>
5757
#include <XEngine_Include/XEngine_SystemSdk/SystemApi_Error.h>
58-
#include <XEngine_Include/XEngine_AVCodec/AVCollect_Define.h>
59-
#include <XEngine_Include/XEngine_AVCodec/AVCollect_Error.h>
6058
#include <XEngine_Include/XEngine_AVCodec/VideoCodec_Define.h>
6159
#include <XEngine_Include/XEngine_AVCodec/VideoCodec_Error.h>
6260
#include <XEngine_Include/XEngine_AVCodec/AudioCodec_Define.h>
6361
#include <XEngine_Include/XEngine_AVCodec/AudioCodec_Error.h>
62+
#include <XEngine_Include/XEngine_AVCodec/AVCollect_Define.h>
63+
#include <XEngine_Include/XEngine_AVCodec/AVCollect_Error.h>
6464
#include <XEngine_Include/XEngine_AVCodec/AVHelp_Define.h>
6565
#include <XEngine_Include/XEngine_AVCodec/AVHelp_Error.h>
6666
#include <XEngine_Include/XEngine_AVCodec/AVFormat_Define.h>
6767
#include <XEngine_Include/XEngine_AVCodec/AVFormat_Error.h>
68+
#include <XEngine_Include/XEngine_AVCodec/AVFilter_Define.h>
69+
#include <XEngine_Include/XEngine_AVCodec/AVFilter_Error.h>
6870
#include "../../XEngine_DependLibrary/XEngine_OPenSource/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h"
6971
#include "../../XEngine_DependLibrary/XEngine_OPenSource/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h"
7072
#include "../../XEngine_DependLibrary/XEngine_OPenSource/XEngine_Module/XEngine_Verification/Verification_Define.h"
@@ -175,6 +177,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig;
175177
#pragma comment(lib,"XEngine_AVCodec/XEngine_AudioCodec.lib")
176178
#pragma comment(lib,"XEngine_AVCodec/XEngine_AVHelp.lib")
177179
#pragma comment(lib,"XEngine_AVCodec/XEngine_AVFormat.lib")
180+
#pragma comment(lib,"XEngine_AVCodec/XEngine_AVFilter.lib")
178181
#pragma comment(lib,"Ws2_32.lib")
179182
#pragma comment(lib,"Dbghelp.lib")
180183
#ifdef _DEBUG

XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_BackService.cpp

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
#include "../XEngine_Hdr.h"
22

33
static bool bRecord = false;
4-
static XHANDLE xhVideo = 0;
4+
static XHANDLE xhVideo = NULL;
5+
static XHANDLE xhAudio = NULL;
56
static XHANDLE xhSound = NULL;
67
static XHANDLE xhScreen = NULL;
78
static XHANDLE xhPacket = NULL;
89
static XHANDLE xhAudioFifo = NULL;
10+
static XNETHANDLE xhFilter = 0;
911

1012
void 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

3754
bool 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);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#pragma once
22
void XCALLBACK HTTPTask_TaskPost_CBVideo(uint8_t* ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo, XPVOID lParam);
3-
void XCALLBACK HTTPTask_TaskPost_CBAudio(uint8_t* ptszAVBuffer, int nAVLen, AVCODEC_TIMESTAMP* pSt_TimeInfo, XPVOID lParam);
3+
void XCALLBACK HTTPTask_TaskPost_CBAudio(AVCODEC_AUDIO_MSGBUFFER* pSt_MSGBuffer, XPVOID lParam);
44

55
bool HTTPTask_TaskPost_BackService(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType);

0 commit comments

Comments
 (0)