Просмотр исходного кода

Z991239-5559 #comment 交易录像支持静音模式录制

80274480 1 год назад
Родитель
Сommit
65d7a2200c

+ 1 - 0
Module/mod_SalesRecorder/mod_SalesRecorder.cpp

@@ -864,6 +864,7 @@ void CSalesRecorderEntity::StartOnSiteSalesRecord(const int fps, const char* vid
 	tAudioParams.iNsPolicy = m_iAudioNsPolicy;
 	tAudioParams.iAudioOutBitRate = audioOutBitRate;
 	tAudioParams.iAudioChannels = m_iAudioChannels;
+	tAudioParams.bMuteAudioMode = false;
 
 	if (eStand2Agent == eRecordType) {
 		tAudioParams.eOutPutType = eLowDefinition;

+ 14 - 0
Module/mod_recorder/mod_recorder.cpp

@@ -16,6 +16,7 @@
 #include "mod_facetracking/sysvar.h"
 #include "mod_interactivecontrol/Event.h"
 #include "mod_mediacontroller/Event.h"
+#include "mod_sipphone/Event.h"
 
 using namespace Recorder;
 
@@ -669,6 +670,19 @@ void CRecorderEntity::StartRecord(const char *videofilename)
 	tAudioParams.iAudioOutBitRate = 8;
 	tAudioParams.bIsTransOn = false;
 	tAudioParams.iAudioChannels = 1;
+	
+
+	CSmartPointer<IEntityFunction> Func = GetFunction();
+	CSimpleStringA strValue("");
+	Func->GetSysVar(SYSVAR_SOUNDCARDSTATE, strValue);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Sound Card State is %s.", strValue);
+	if ('N' == strValue[0] || 'P' == strValue[0]) {
+		tAudioParams.bMuteAudioMode = false;
+	}
+	else {
+		tAudioParams.bMuteAudioMode = true;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("handfree audio is error, tansaction record use mute audio mode.");
+	}
 
 	if (m_pRecorder->StartVideoRecord(fps, 75, eMP4, &tAudioParams, NULL, false, true, m_TempDir.GetData(), m_RecordSaveDir.GetLength(), videofilename, strlen(videofilename)))
 	{

+ 1 - 0
Other/unix/libvideorecord/libvideorecord.h

@@ -89,6 +89,7 @@ typedef struct Rvc_RecordAudioParam_s{
 	int iAudioOutBitRate;
 	bool bIsTransOn;
 	int iAudioChannels;
+	bool bMuteAudioMode;
 }Rvc_RecordAudioParam_t;
 
 

+ 68 - 28
Other/unix/libvideorecord/libvideorecord_impl.cpp

@@ -160,7 +160,7 @@ static uint32_t BindPCMAudioData(uint32_t uBufferLen, char* pLocalAudios, uint32
 		memset(pLocalAudios, 0, uBufferLen);
 	}
 
-	for (int i = 0; i < uLocalAudioLen / uBitDeepth; i++) {
+	for (uint32_t i = 0; i < uLocalAudioLen / uBitDeepth; i++) {
 		if (eLocalLeft == eType) {
 			memcpy((uint32_t*)pLocalAudios + i, ((uint16_t*)(pBuffer)) + i, uBitDeepth);
 			uint16_t* pindex = (uint16_t*)((uint32_t*)pLocalAudios + i) + 1;
@@ -205,9 +205,9 @@ static uint32_t ConstructStereoAudioData(uint32_t uBufferLen, char* pAudiosBuffe
 }
 
 
-static size_t Get8KOutPutBitRate(int iChannels, eAudioOutPutType eType)
+static uint32_t Get8KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 16 * 8;
+	uint32_t uOutBitRate = 16 * 8;
 	if (1 == iChannels) {
 		if (eUltraHD == eType) {
 			uOutBitRate = 1000 * 8;
@@ -237,9 +237,9 @@ static size_t Get8KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 }
 
 
-static size_t Get16KOutPutBitRate(int iChannels, eAudioOutPutType eType)
+static uint32_t Get16KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 1000 * 8;
+	uint32_t uOutBitRate = 1000 * 8;
 	if (1 == iChannels) {
 		if (eUltraHD == eType) {
 			uOutBitRate = 2000 * 8;
@@ -266,9 +266,9 @@ static size_t Get16KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 }
 
 
-static size_t Get32KOutPutBitRate(int iChannels, eAudioOutPutType eType)
+static uint32_t Get32KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 1000 * 8;
+	uint32_t uOutBitRate = 1000 * 8;
 	if (1 == iChannels) {
 		if (eUltraHD == eType) {
 			uOutBitRate = 2500 * 8;
@@ -289,9 +289,9 @@ static size_t Get32KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 }
 
 
-static size_t Get44KOutPutBitRate(int iChannels, eAudioOutPutType eType)
+static uint32_t Get44KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 2000 * 8;
+	uint32_t uOutBitRate = 2000 * 8;
 	if (1 == iChannels) {
 		if (eUltraHD == eType) {
 			uOutBitRate = 6000 * 8;
@@ -318,9 +318,9 @@ static size_t Get44KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 }
 
 
-static size_t Get48KOutPutBitRate(int iChannels, eAudioOutPutType eType)
+static uint32_t Get48KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 24000 * 8;
+	uint32_t uOutBitRate = 24000 * 8;
 	if (eUltraHD == eType) {
 		uOutBitRate = 24000 * 8;
 	}
@@ -337,9 +337,9 @@ static size_t Get48KOutPutBitRate(int iChannels, eAudioOutPutType eType)
 }
 
 
-static size_t GetAudioOutPutBitRate(int iInPutSamperate, int iChannels, eAudioOutPutType eType)
+static uint32_t GetAudioOutPutBitRate(int iInPutSamperate, int iChannels, eAudioOutPutType eType)
 {
-	size_t uOutBitRate = 8000;
+	uint32_t uOutBitRate = 8000;
 
 	switch (iInPutSamperate)
 	{
@@ -443,6 +443,8 @@ libvideorecord_impl::libvideorecord_impl(bool* pResult, CHostApi* pHostAPI, cons
 
 	m_pFFmpegWriter = NULL;
 	m_pAudioNsObj = NULL;
+	m_bMuteAudio = false;
+
 	*pResult = true;
 }
 
@@ -1072,7 +1074,7 @@ int libvideorecord_impl::GetSingleCameraVideoFrameData(videoq_frame* Video, int
 
 //获取env摄像头数据失败返回-1
 //获取opt摄像头数据失败返回-2
-//获取env摄像头数据失败返回-3
+//获取远端视频数据失败返回-3
 int libvideorecord_impl::GetStand2SVideoFrameData(videoq_frame* Video, int flags, const bool bSwitchCam, int iInitCam, eRvcRecordType eRecordType)
 {
 	if (!m_remote_videoqueue) {
@@ -1081,7 +1083,6 @@ int libvideorecord_impl::GetStand2SVideoFrameData(videoq_frame* Video, int flags
 	}
 	//将大机摄像头和远端视频拼接到一张画布中
 	memset(Video->data, 0, Video->framesize);
-
 	bool bRslt = false;
 	int width = 0;
 	int height = 0;
@@ -1739,6 +1740,7 @@ bool libvideorecord_impl::StartVideoRecord(int fps, int videoquality, eVideoForm
 	m_iNsPolicy = pAudioParam->iNsPolicy;
 	m_bIsAudioTransOn = pAudioParam->bIsTransOn;
 	m_iAudioChannels = pAudioParam->iAudioChannels;
+	m_bMuteAudio = pAudioParam->bMuteAudioMode;
 
 	m_audioqueue = m_local_audioqueue;
 	if (m_sales_audioqueue && (eSingleSide == m_eRecordType || eStand2Agent == m_eRecordType))  //当大机进行双录拼接时使用本地音频队列会出现抢占导致取音频失败,此处选择使用销售音频队列
@@ -2016,7 +2018,7 @@ bool libvideorecord_impl::GetLocalAudioFrame(int iAudioLens)
 
 bool libvideorecord_impl::GetSingleSideAudioFrame()
 {
-	bool bRet = true;
+	bool bRet = false;
 	//取音频数据,合并成1s的音频
 	int nAudioLens = m_audioqueue->GetAudioLens();
 	if (nAudioLens > 0) {
@@ -2050,14 +2052,35 @@ bool libvideorecord_impl::AddMuteAudioFrame(bool bLocal, int iAudioFrameSize)
 		memset(m_pRecordAudioBuffer + m_iAudioBufferLen, 0, iAudioFrameSize);
 		m_iAudioBufferLen += iAudioFrameSize;
 		m_iAudioFromQueNum++;
-		m_pHostApi->Debug(RECORD_LOG_INFO, "m_iAudioFromQueNum is %d(Mute AudioFrame).", m_iAudioFromQueNum);
+		if (0 == m_iAudioFromQueNum % 100) {
+			m_pHostApi->Debug(RECORD_LOG_DEBUG, "m_iAudioFromQueNum is %d(Mute AudioFrame).", m_iAudioFromQueNum);
+		}
 		bRet = true;
 	}
 	else {
 		memset(m_pRemoteAudioBuffer + m_iRemoteAudioBufLen, 0, iAudioFrameSize);
 		m_iRemoteAudioBufLen += iAudioFrameSize;
 		m_iRemoteAudioNum++;
-		m_pHostApi->Debug(RECORD_LOG_INFO, "m_iRemoteAudioNum is %d(Mute Audio Frame).", m_iRemoteAudioNum);
+		if (0 == m_iRemoteAudioNum % 100) {
+			m_pHostApi->Debug(RECORD_LOG_DEBUG, "m_iRemoteAudioNum is %d(Mute Audio Frame).", m_iRemoteAudioNum);
+		}
+		bRet = true;
+	}
+
+	return bRet;
+}
+
+
+bool libvideorecord_impl::InitDefaultAudioParams(audio_frame* paudio)
+{
+	bool bRet = false;
+	if (NULL != paudio) {
+		paudio->samplespersec = 8000;
+		paudio->framesize = 320;
+		paudio->nchannels = 1;
+		paudio->format = 1;
+		paudio->bitspersample = 16;
+		paudio->iseriesnumber = 0;
 		bRet = true;
 	}
 
@@ -2069,7 +2092,12 @@ bool libvideorecord_impl::GetRecordAudioFrame()
 	bool bRet = false;
 	//单向只录制本地音频
 	if (eSingleSide == m_eRecordType) {
-		bRet = GetSingleSideAudioFrame();
+		if (false == m_bMuteAudio) {
+			bRet = GetSingleSideAudioFrame();
+		}
+		else {
+			bRet = AddMuteAudioFrame(true, m_iAudioPerSecBufLen / 50);
+		}
 	}
 	else{
 		//取音频数据,合并成1秒的音频
@@ -2149,12 +2177,18 @@ bool libvideorecord_impl::InitVideoRecordParams()
 		return bRet;
 	}
 
-	//获取音频帧大小
-	if (!GetRecordAudioFrameSize()) {
-		if (false == m_bStopRecord) {
-			LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Failed Max Times.", true);
+	// 静音模式录像
+	if (m_bMuteAudio) {
+		m_iAudioFrameSize = 320;
+	}
+	else {
+		//获取音频帧大小
+		if (!GetRecordAudioFrameSize()) {
+			if (false == m_bStopRecord) {
+				LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Failed Max Times.", true);
+			}
+			return bRet;
 		}
-		return bRet;
 	}
 
 	//初始化视频buffer
@@ -2162,10 +2196,16 @@ bool libvideorecord_impl::InitVideoRecordParams()
 
 	//获取音频参数
 	audio_frame* audio = new audio_frame;
-	if (!GetRecordAudioParams(&audio)) {
-		RECORD_SAFE_DELETE(audio);
-		LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Data Failed Max Times.", true);
-		return bRet;
+	// 静音模式录像
+	if (m_bMuteAudio) {
+		InitDefaultAudioParams(audio);
+	}
+	else {
+		if (!GetRecordAudioParams(&audio)) {
+			RECORD_SAFE_DELETE(audio);
+			LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Data Failed Max Times.", true);
+			return bRet;
+		}
 	}
 
 	CalcuRecordAudioParams(audio);

+ 4 - 2
Other/unix/libvideorecord/libvideorecord_impl.h

@@ -100,7 +100,7 @@ private:
 	void MediaSynchronous();
 	int WriteVideoFrame();
 	int WriteAudioFrame();
-	bool GetRecordAudioFrame(); 
+	bool GetRecordAudioFrame();
 	bool GetSingleSideAudioFrame();
 	bool GetLocalAudioFrame(int iAudioLens);
 	bool GetRemoteAudioFrame(int iAudioLens);
@@ -108,18 +108,20 @@ private:
 	bool InitVideoRecordParams();
 	int HandleLeftAudioData();
 	bool AddMuteAudioFrame(bool bLocal, int iAudioFrameSize);
+	bool InitDefaultAudioParams(audio_frame* paudio);
 
 
 private:
 	sem_t m_semt;
 	bool m_bStopRecord;
-	eRvcRecordType m_eRecordType; //录制双向的视频类型,0:单向录制,1:手机<->pad双录,2:坐席<->pad双录,3:坐席<->大机双录
+	eRvcRecordType m_eRecordType; //录制双向的视频类型,0:单向录制,1:坐席<->大机双录
 	eAudioOutPutType m_eAudioType;
 	bool m_bIsAudioNsOn;		  //是否开启音频降噪功能开关
 	int m_iNsPolicy;			  //音频降噪等级
 	bool m_bIsAudioTransOn;		  //是否开始音频传输到识别服务器开关
 	int m_iAudioChannels;		  //录制音频通道数
 	bool m_bPauseRecord;
+	bool m_bMuteAudio;
 
 	int m_nFps;
 	int m_videoquality;

+ 2 - 2
Other/win/libvideorecord/libvideorecord.h

@@ -50,7 +50,6 @@ enum record_loglevel {
 	RECORD_LOG_DEBUG,
 	RECORD_LOG_INFO,
 	RECORD_LOG_ERROR
-
 };
 
 enum eAudioOutPutType{
@@ -69,7 +68,7 @@ static const char* audio_quality_type_table[] = {
 	"eUltraHD"
 };
 
-//录制双向的视频类型,0:单向录制,1:手机<->pad双录,2:坐席<->pad双录,3:坐席<->大机双录
+//录制双向的视频类型,0:单向录制,1:坐席<->大机双录
 enum eRvcRecordType{
 	eSingleSide,
 	eStand2Agent
@@ -89,6 +88,7 @@ typedef struct Rvc_RecordAudioParam_s{
 	int iAudioOutBitRate;
 	bool bIsTransOn;
 	int iAudioChannels;
+	bool bMuteAudioMode;
 }Rvc_RecordAudioParam_t;
 
 

+ 84 - 47
Other/win/libvideorecord/libvideorecord_impl.cpp

@@ -24,6 +24,36 @@
 #endif // !RECORD_FAILED_MAX_TIMES
 
 
+static bool FindMatchedFile(LPCSTR sFindPath, LPCSTR sFindFileName, std::string& sMatchedFile)
+{
+	char sPath[MAX_PATH] = { 0 };
+	char sFormatFileName[MAX_PATH + 2] = "*";
+	WIN32_FIND_DATA FindFileData;
+	HANDLE hFind;
+
+	lstrcpy(sFormatFileName, sFindPath);
+	if (sFindPath[strlen(sFindPath) - 1] != '\\') {
+		lstrcat(sFormatFileName, "\\*");
+	}
+	else {
+		lstrcat(sFormatFileName, "*");
+	}
+	lstrcat(sFormatFileName, sFindFileName);
+	lstrcat(sFormatFileName, "*");
+
+	hFind = FindFirstFile(sFormatFileName, &FindFileData);
+
+	if (hFind == INVALID_HANDLE_VALUE) {
+		sMatchedFile = "";
+		return false;
+	}
+	else {
+		sMatchedFile = FindFileData.cFileName;
+		FindClose(hFind);
+	}
+
+	return true;
+}
 
 static bool ReNameFile(const char* file, const char* newfilename)
 {
@@ -283,38 +313,6 @@ static uint32_t ConvertStereo2Mono(char* pDstBuf, const uint32_t uDstLen, char*
 }
 
 
-static bool FindMatchedFile(LPCSTR sFindPath, LPCSTR sFindFileName, std::string& sMatchedFile)
-{
-	char sPath[MAX_PATH] = { 0 };
-	char sFormatFileName[MAX_PATH + 2] = "*";
-	WIN32_FIND_DATA FindFileData;
-	HANDLE hFind;
-
-	lstrcpy(sFormatFileName, sFindPath);
-	if (sFindPath[strlen(sFindPath) - 1] != '\\') {
-		lstrcat(sFormatFileName, "\\*");
-	}
-	else {
-		lstrcat(sFormatFileName, "*");
-	}
-	lstrcat(sFormatFileName, sFindFileName);
-	lstrcat(sFormatFileName, "*");
-
-	hFind = FindFirstFile(sFormatFileName, &FindFileData);
-
-	if (hFind == INVALID_HANDLE_VALUE) {
-		sMatchedFile = "";
-		return false;
-	}
-	else {
-		sMatchedFile = FindFileData.cFileName;
-		FindClose(hFind);
-	}
-
-	return true;
-}
-
-
 static void __recordlog(void* user_data, const char* fmt, va_list arg)
 {
 	libvideorecord_impl* pRecord = (libvideorecord_impl*)user_data;
@@ -386,6 +384,7 @@ libvideorecord_impl::libvideorecord_impl(bool* pResult, CHostApi* pHostAPI, cons
 
 	m_pFFmpegWriter = NULL;
 	//m_pAudioNsObj = NULL;
+	m_bMuteAudio = false;
 	*pResult = true;
 }
 
@@ -1538,6 +1537,7 @@ bool libvideorecord_impl::StartVideoRecord(int fps, int videoquality, eVideoForm
 	m_iNsPolicy = pAudioParam->iNsPolicy;
 	m_bIsAudioTransOn = pAudioParam->bIsTransOn;
 	m_iAudioChannels = pAudioParam->iAudioChannels;
+	m_bMuteAudio = pAudioParam->bMuteAudioMode;
 
 	m_audioqueue = m_local_audioqueue;
 	if (m_sales_audioqueue && (eSingleSide == m_eRecordType || eStand2Agent == m_eRecordType))  //当大机进行双录拼接时使用本地音频队列会出现抢占导致取音频失败,此处选择使用销售音频队列
@@ -1781,7 +1781,7 @@ bool libvideorecord_impl::GetLocalAudioFrame(int iAudioLens)
 
 bool libvideorecord_impl::GetSingleSideAudioFrame()
 {
-	bool bRet = true;
+	bool bRet = false;
 	//取音频数据,合并成1s的音频
 	int nAudioLens = m_audioqueue->GetAudioLens();
 	if (nAudioLens > 0) {
@@ -1815,14 +1815,35 @@ bool libvideorecord_impl::AddMuteAudioFrame(bool bLocal, int iAudioFrameSize)
 		memset(m_pRecordAudioBuffer + m_iAudioBufferLen, 0, iAudioFrameSize);
 		m_iAudioBufferLen += iAudioFrameSize;
 		m_iAudioFromQueNum++;
-		m_pHostApi->Debug(RECORD_LOG_INFO, "m_iAudioFromQueNum is %d(Mute AudioFrame).", m_iAudioFromQueNum);
+		if (0 == m_iAudioFromQueNum % 100) {
+			m_pHostApi->Debug(RECORD_LOG_DEBUG, "m_iAudioFromQueNum is %d(Mute AudioFrame).", m_iAudioFromQueNum);
+		}
 		bRet = true;
 	}
 	else {
 		memset(m_pRemoteAudioBuffer + m_iRemoteAudioBufLen, 0, iAudioFrameSize);
 		m_iRemoteAudioBufLen += iAudioFrameSize;
 		m_iRemoteAudioNum++;
-		m_pHostApi->Debug(RECORD_LOG_INFO, "m_iRemoteAudioNum is %d(Mute Audio Frame).", m_iRemoteAudioNum);
+		if (0 == m_iRemoteAudioNum % 100) {
+			m_pHostApi->Debug(RECORD_LOG_DEBUG, "m_iRemoteAudioNum is %d(Mute Audio Frame).", m_iRemoteAudioNum);
+		}
+		bRet = true;
+	}
+
+	return bRet;
+}
+
+
+bool libvideorecord_impl::InitDefaultAudioParams(audio_frame* paudio)
+{
+	bool bRet = false;
+	if (NULL != paudio) {
+		paudio->samplespersec = 8000;
+		paudio->framesize = 320;
+		paudio->nchannels = 1;
+		paudio->format = 1;
+		paudio->bitspersample = 16;
+		paudio->iseriesnumber = 0;
 		bRet = true;
 	}
 
@@ -1834,7 +1855,12 @@ bool libvideorecord_impl::GetRecordAudioFrame()
 	bool bRet = false;
 	//单向只录制本地音频
 	if (eSingleSide == m_eRecordType) {
-		bRet = GetSingleSideAudioFrame();
+		if (false == m_bMuteAudio) {
+			bRet = GetSingleSideAudioFrame();
+		}
+		else {
+			bRet = AddMuteAudioFrame(true, m_iAudioPerSecBufLen / 50);
+		}
 	}
 	else{
 		//取音频数据,合并成1秒的音频
@@ -1914,31 +1940,42 @@ bool libvideorecord_impl::InitVideoRecordParams()
 		return bRet;
 	}
 
-	//获取音频帧大小
-	if (!GetRecordAudioFrameSize()) {
-		if (false == m_bStopRecord) {
-			LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Failed Max Times.", true);
+	// 静音模式录像
+	if (m_bMuteAudio) {
+		m_iAudioFrameSize = 320;
+	}
+	else {
+		//获取音频帧大小
+		if (!GetRecordAudioFrameSize()) {
+			if (false == m_bStopRecord) {
+				LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Failed Max Times.", true);
+			}
+			return bRet;
 		}
-		return bRet;
 	}
 
 	//初始化视频buffer
 	InitRecordVideoFrameBuffer();
 
-
 	//获取音频参数
 	audio_frame* audio = new audio_frame;
-	if (!GetRecordAudioParams(&audio)) {
-		RECORD_SAFE_DELETE(audio);
-		LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Data Failed Max Times.", true);
-		return bRet;
+	// 静音模式录像
+	if (m_bMuteAudio) {
+		InitDefaultAudioParams(audio);
+	}
+	else {
+		if (!GetRecordAudioParams(&audio)) {
+			RECORD_SAFE_DELETE(audio);
+			LogFailedEvent(eLocalAudioGetFailed, "Get Audio Frame Data Failed Max Times.", true);
+			return bRet;
+		}
 	}
 
 	CalcuRecordAudioParams(audio);
 	//初始化音频buffer
 	InitRecordAudioBuffer();
 
-	size_t uOutPutBitRate = GetAudioOutPutBitRate(audio->samplespersec, m_iAudioChannels, m_eAudioType);
+	uint32_t uOutPutBitRate = GetAudioOutPutBitRate(audio->samplespersec, m_iAudioChannels, m_eAudioType);
 	//if (m_bIsAudioNsOn && NULL != m_pAudioNsObj) {
 	//	if (m_pAudioNsObj->SetNsParams(audio->samplespersec, CAPTURE_FRAME_TIME, m_iNsPolicy)) {
 	//		m_bIsAudioNsOn = false;

+ 3 - 1
Other/win/libvideorecord/libvideorecord_impl.h

@@ -107,18 +107,20 @@ private:
 	bool InitVideoRecordParams();
 	int HandleLeftAudioData();
 	bool AddMuteAudioFrame(bool bLocal, int iAudioFrameSize);
+	bool InitDefaultAudioParams(audio_frame* paudio);
 
 
 private:
 	HANDLE m_hEventWait; // CreateEvent
 	bool m_bStopRecord;
-	eRvcRecordType m_eRecordType; //录制双向的视频类型,0:单向录制,1:手机<->pad双录,2:坐席<->pad双录,3:坐席<->大机双录
+	eRvcRecordType m_eRecordType; //录制双向的视频类型,0:单向录制,1:坐席<->大机双录
 	eAudioOutPutType m_eAudioType;
 	bool m_bIsAudioNsOn;		  //是否开启音频降噪功能开关
 	int m_iNsPolicy;			  //音频降噪等级
 	bool m_bIsAudioTransOn;		  //是否开始音频传输到识别服务器开关
 	int m_iAudioChannels;		  //录制音频通道数
 	bool m_bPauseRecord;
+	bool m_bMuteAudio;
 
 	int m_nFps;
 	int m_videoquality;