Browse Source

Z991239-5614 #comment UOS支持选择下摄像头录像

80274480 1 year ago
parent
commit
45d34a2f08

+ 4 - 1
Module/mod_SalesRecorder/Event.h

@@ -23,4 +23,7 @@
 #define LOG_EVT_SALESRECORD_ENCRYPT_FAILED			    0x31520001				//文件加密失败
 #define LOG_EVT_SALESRECORD_DELETE_FAILED			    0x31520002				//录像删除失败
 #define LOG_EVT_SALESRECORD_RENAME_FAILED			    0x31520003				//文件重命名失败
-#define LOG_EVT_SALESRECORD_MOVE_FAILED					0x31520004				//文件移动失败
+#define LOG_EVT_SALESRECORD_MOVE_FAILED					0x31520004				//文件移动失败
+
+#define LOG_EVT_SALESRECORD_USE_ENVCAMERA				0x31520005				//远程双录使用上摄像头
+#define LOG_EVT_SALESRECORD_USE_OPTCAMERA				0x31520006				//远程双录使用下摄像头

+ 160 - 115
Module/mod_SalesRecorder/mod_SalesRecorder.cpp

@@ -447,19 +447,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 	//MessageBoxA(0,0,0,0);
 	m_eDeviceType = eStand2sType;
 	m_bNeedRestart = false;
-	m_eAudioOutQuality = eUltraHD;
-	m_bIsAudioNsOn = false;
-	m_iAudioNsPolicy = 2;
-	m_iAudioChannels = 1;
-
-	m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
-	m_iHttpTimeOut = RVC_HTTPTIMEOUT;
-	m_strHttpServerAddr = RVC_UPLOAD_VIDEORECORDING_HTTP_ADDR;
-	m_strAppVersion = NULL;
-	m_strTerminalId = NULL;
-	m_bPostOn = false;
-	m_bWholeSection = false;
-	m_bEncFlag = true;
 
 #ifdef RVC_OS_WIN
 	m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
@@ -471,78 +458,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 
 	m_eDeviceType = RvcGetDeviceType();
 
-	int iAudioQuality = 3;
-	int iAudioNsPolicy = 2;
-	int iIsAudioNsOn = 0;
-	int iAudioChannels = 1;
-	int iLogLevel = 1;
-	int iLowestLevel = 1;
-	int iTimeOut = RVC_HTTPTIMEOUT;
-	CSimpleStringA strHttpServerAddr("");
-	int iPostOn = 0;
-	m_max_disk_percent = MAX_DISK_PERCENT; 
-	m_audio_samplerate = 8;
-	int iStopEncflag = 0;
-	CSmartPointer<IConfigInfo> spConfig;
-	CSmartPointer<IEntityFunction> spFunction = GetFunction();
-	if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
-		spConfig->ReadConfigValueInt("SalesRecorder","MaxDiskPercent",m_max_disk_percent);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioSampleRate",m_audio_samplerate);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioBitRate",m_audio_out_bitrate);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioNsPolicy",iAudioNsPolicy);
-		spConfig->ReadConfigValueInt("SalesRecorder","IsAudioNsOn",iIsAudioNsOn);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioQuality",iAudioQuality);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioChannels",iAudioChannels);
-		spConfig->ReadConfigValueInt("SalesRecorder","LogLevel",iLogLevel);
-		spConfig->ReadConfigValueInt("SalesRecorder","LowestLevel",iLowestLevel);
-		spConfig->ReadConfigValueInt("SalesRecorder", "post_salesrecord_info_on", iPostOn);
-		spConfig->ReadConfigValue("Recorder", "http_video_record_addr", strHttpServerAddr);
-		spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
-		spConfig->ReadConfigValueInt("SalesRecorder", "stopencflag", iStopEncflag);
-	}
-
-	if (m_max_disk_percent <= 0 || m_max_disk_percent >= 100) {
-		m_max_disk_percent = MAX_DISK_PERCENT;
-	}
-
-	if (iLogLevel <= RECORD_LOG_ERROR && iLogLevel > 0){
-		m_loglevel = (record_loglevel)iLogLevel;
-	}
-
-	if (iLowestLevel <= RECORD_LOG_ERROR && iLowestLevel > 0){
-		m_lowestlevel = (record_loglevel)iLowestLevel;
-	}
-
-	if (strHttpServerAddr.GetLength() > 0) {
-		m_strHttpServerAddr = strHttpServerAddr;
-	}
-
-	if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
-		m_iHttpTimeOut = iTimeOut;
-	}
-
-	if (1 == iPostOn) {
-		m_bPostOn = true;
-	}
-
-	SetRecordAudioQuality(iAudioQuality);
-	SetRecordAudioNsPolicy(iAudioNsPolicy);
-	SetRecordAudioChannles(iAudioChannels);
-
-	if (0 != iIsAudioNsOn){
-		m_bIsAudioNsOn = true;
-	}
-	
-	if (1 == iStopEncflag) {
-		m_bEncFlag = false;
-	}
-
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_bEncFlag is %s.", m_bEncFlag ? "true" : "false");
-
-	if (m_bWholeSection != 0 && m_bWholeSection != 1){
-		m_bWholeSection = false;
-	}
-
 	if (preOperationError != Error_Succeed) {
 		return preOperationError;
 	}
@@ -599,12 +514,30 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 
 void CSalesRecorderEntity::OnStarted()
 {
+	m_eAudioOutQuality = eUltraHD;
+	m_bIsAudioNsOn = false;
+	m_iAudioNsPolicy = 2;
+	m_iAudioChannels = 1;
+
+	m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
+	m_iHttpTimeOut = RVC_HTTPTIMEOUT;
+	m_strHttpServerAddr = RVC_UPLOAD_VIDEORECORDING_HTTP_ADDR;
+	m_strAppVersion = NULL;
+	m_strTerminalId = NULL;
+	m_bPostOn = false;
+	m_bWholeSection = false;
+	m_bEncFlag = true;
+	m_iRemoteRecordType = 0;
+
 	CSystemStaticInfo si;
 	ErrorCodeEnum Error = GetFunction()->GetSystemStaticInfo(si);
 	if (Error == Error_Succeed) {
 		m_strAppVersion = si.InstallVersion.ToString();
 		m_strTerminalId = si.strTerminalID;
 	}
+
+	GetEntityConfig();
+
 #ifndef RVC_OS_WIN
 	InitSalesRecorder();
 #endif
@@ -692,9 +625,24 @@ void CSalesRecorderEntity::vDebug(record_loglevel elevel, const char* str, va_li
 	}
 }
 
-int CSalesRecorderEntity::GetActiveCamera()
+int CSalesRecorderEntity::GetRecordCamera()
 {
-	return m_iActiveCamera;
+	int iRecordCamera = m_iRecordCamera;
+	if (1 != m_iRemoteRecordType) {
+		iRecordCamera = m_iActiveCamera;
+	}
+	else {
+		if (0 == iRecordCamera) {
+			LogWarn(Severity_Low, Error_Debug, LOG_EVT_SALESRECORD_USE_ENVCAMERA, "remote video record use env camera.");
+		}
+		else {
+			LogWarn(Severity_Low, Error_Debug, LOG_EVT_SALESRECORD_USE_OPTCAMERA, "remote video record use opt camera.");
+		}
+	}
+
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("remote record camera is %d.", iRecordCamera);
+	
+	return iRecordCamera;
 }
 
 int CSalesRecorderEntity::GetCameraState()
@@ -1130,39 +1078,49 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 
 	size_t ulen = strlen(pszMessage);
 	char *tmp = new char[ulen+1];
+	memset(tmp, 0, ulen + 1);
+	memcpy(tmp, pszMessage, ulen);
+
+	char* result[16] = { 0 };
+
 #ifdef RVC_OS_WIN
-	strncpy_s(tmp, ulen+1, pszMessage, ulen);
-	
-	char *result[16] = {0};
-	//CStringSplit(tmp, result, "@");
-	// 解决中文stringsplit偶现乱码的问题 edit by ly@2018/07/04
 	auto arr1 = CSimpleStringA2W(tmp).Split('@');
 	auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
-	for (int i = 0; i < arr1.GetCount(); ++i)
-	{
+	for (int i = 0; i < arr1.GetCount(); ++i){
 		arr2[i] = CSimpleStringW2A(arr1[i]);
-		result[i] = const_cast<LPSTR>(arr2[i].GetData());
+		result[i] = const_cast<char*>(arr2[i].GetData());
 	}
+	_snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]);			//录像名:录像类型标志_录像流水号(如S_C13213EF)
 
-	sprintf(m_SalesVideoName, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
 #else
-	strncpy(tmp, pszMessage, ulen);
-	
-	char *result[32] = {0};
-	CStringSplit(tmp, result, "@");
 
+	CStringSplit(tmp, result, "@");
 	memset(m_SalesVideoName, 0, MAX_PATH);
 	if (result[4]) {
-		snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
+		snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]);		//录像名:录像类型标志_录像流水号(如S_C13213EF)
 	}
 #endif	
+
+	int iPostionArr[4][2] = { 0 };
+	for (int i = 0; i < 4; i++){
+		sscanf(result[i], "%d|%d", &iPostionArr[i][0], &iPostionArr[i][1]);
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local video frame size is (%d,%d).", iPostionArr[2][0], iPostionArr[3][0]);
+	if (iPostionArr[2][0] >= iPostionArr[3][0]) {
+		m_iRecordCamera = CAMERA_TYPE_ENV;
+	}
+	else {
+		m_iRecordCamera = CAMERA_TYPE_OPT;
+	}
+
 	RecordSubTitle subTitle;
-	ZeroMemory(&subTitle,sizeof(RecordSubTitle));
+	memset(&subTitle, 0, sizeof(RecordSubTitle));
 
 	if (result[5]) {
 		CSimpleStringA strCardNo = DecryptString(result[5]);
 		if (sizeof(subTitle.CustCardNo) > strCardNo.GetLength()) {
-			snprintf(subTitle.CustCardNo, sizeof(subTitle.CustCardNo), "%s", strCardNo.GetData());
+			_snprintf(subTitle.CustCardNo, sizeof(subTitle.CustCardNo), "%s", strCardNo.GetData());
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invalid CustCardNo.");
@@ -1177,7 +1135,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 		}
 		else {
 			CSimpleStringW aa = szCustName.SubString(0, 4);
-			sprintf(subTitle.CustName, "%s...", (LPCTSTR)CSimpleStringW2A(aa));
+			_snprintf(subTitle.CustName, 32, "%s...", CSimpleStringW2A(aa).GetData());
 		}
 	}
 
@@ -1191,7 +1149,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 			char aa[5] = { 0 }, bb[5] = { 0 };
 			strncpy(aa, pStr, 4);
 			strncpy(bb, pStr + nProductCodeLen - 4, 4);
-			sprintf(subTitle.ProductCode, "%s...%s", aa, bb);
+			_snprintf(subTitle.ProductCode, 32, "%s...%s", aa, bb);
 		}
 	}
 
@@ -1204,13 +1162,14 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 		else {
 			CSimpleStringW aa = szProductName.SubString(0, 3);
 			CSimpleStringW bb = szProductName.SubString(szProductName.GetLength() - 2, 2);
-			sprintf(subTitle.ProductName, "%s...%s", (LPCTSTR)CSimpleStringW2A(aa), (LPCTSTR)CSimpleStringW2A(bb));
+			_snprintf(subTitle.ProductName, 128, "%s...%s", CSimpleStringW2A(aa).GetData(), CSimpleStringW2A(bb).GetData());
 		}
 	}
 
 	if (result[9]) {
 		strcpy(subTitle.SapID, result[9]);
-	} else {
+	} 
+	else {
 		subTitle.SapID[0] = '\0';
 	}
 
@@ -1222,7 +1181,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 		}
 		else {
 			CSimpleStringW aa = szCustManagerName.SubString(0,4);
-			sprintf(subTitle.CustManagerName,"%s...",(LPCTSTR)CSimpleStringW2A(aa));
+			_snprintf(subTitle.CustManagerName, 32,"%s...",CSimpleStringW2A(aa).GetData());
 		}
 	} else {
 		subTitle.CustManagerName[0] = '\0';
@@ -1232,18 +1191,18 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 	tmp = NULL;
 
 	SubtitleParam subtitleParam;
-	ZeroMemory(&subtitleParam,sizeof(SubtitleParam));
-	subtitleParam.bSubtitle = TRUE;
-	subtitleParam.bSubtitleSection = TRUE;
+	memset(&subtitleParam, 0, sizeof(SubtitleParam));
+	subtitleParam.bSubtitle = true;
+	subtitleParam.bSubtitleSection = true;
 	subtitleParam.topSubtitleData[0] = '\0';
 #ifdef RVC_OS_WIN
 	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
-		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s  %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
-		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s  %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
+		_snprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, "%s  %s  %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
+		_snprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, "%s  %s  %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
 	}
 	else{
-		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s", subTitle.CustCardNo, subTitle.CustName);
-		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s", subTitle.ProductCode, subTitle.ProductName);
+		_snprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, "%s  %s", subTitle.CustCardNo, subTitle.CustName);
+		_snprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, "%s  %s", subTitle.ProductCode, subTitle.ProductName);
 	}
 #else
 	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
@@ -1898,6 +1857,92 @@ ErrorCodeEnum CSalesRecorderEntity::SetRecordCamera(int iCamera)
 	return Error;
 }
 
+ErrorCodeEnum CSalesRecorderEntity::GetEntityConfig()
+{
+	ErrorCodeEnum Error = Error_Succeed;
+
+	int iAudioQuality = 3;
+	int iAudioNsPolicy = 2;
+	int iIsAudioNsOn = 0;
+	int iAudioChannels = 1;
+	int iLogLevel = 1;
+	int iLowestLevel = 1;
+	int iTimeOut = RVC_HTTPTIMEOUT;
+	CSimpleStringA strHttpServerAddr("");
+	int iPostOn = 0;
+	m_max_disk_percent = MAX_DISK_PERCENT;
+	m_audio_samplerate = 8;
+	int iStopEncflag = 0;
+	int iRemoteRecordType = 0;
+
+	CSmartPointer<IConfigInfo> spConfig;
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
+		spConfig->ReadConfigValueInt("SalesRecorder", "MaxDiskPercent", m_max_disk_percent);
+		spConfig->ReadConfigValueInt("SalesRecorder", "AudioSampleRate", m_audio_samplerate);
+		spConfig->ReadConfigValueInt("SalesRecorder", "AudioBitRate", m_audio_out_bitrate);
+		spConfig->ReadConfigValueInt("SalesRecorder", "AudioNsPolicy", iAudioNsPolicy);
+		spConfig->ReadConfigValueInt("SalesRecorder", "IsAudioNsOn", iIsAudioNsOn);
+		spConfig->ReadConfigValueInt("SalesRecorder", "AudioQuality", iAudioQuality);
+		spConfig->ReadConfigValueInt("SalesRecorder", "AudioChannels", iAudioChannels);
+		spConfig->ReadConfigValueInt("SalesRecorder", "LogLevel", iLogLevel);
+		spConfig->ReadConfigValueInt("SalesRecorder", "LowestLevel", iLowestLevel);
+		spConfig->ReadConfigValueInt("SalesRecorder", "post_salesrecord_info_on", iPostOn);
+		spConfig->ReadConfigValue("Recorder", "http_video_record_addr", strHttpServerAddr);
+		spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
+		spConfig->ReadConfigValueInt("SalesRecorder", "stopencflag", iStopEncflag);
+		spConfig->ReadConfigValueInt("InteractiveControl", "RemoteRecordType", iRemoteRecordType);
+	}
+
+	if (m_max_disk_percent <= 0 || m_max_disk_percent >= 100) {
+		m_max_disk_percent = MAX_DISK_PERCENT;
+	}
+
+	if (iLogLevel <= RECORD_LOG_ERROR && iLogLevel > 0) {
+		m_loglevel = (record_loglevel)iLogLevel;
+	}
+
+	if (iLowestLevel <= RECORD_LOG_ERROR && iLowestLevel > 0) {
+		m_lowestlevel = (record_loglevel)iLowestLevel;
+	}
+
+	if (strHttpServerAddr.GetLength() > 0) {
+		m_strHttpServerAddr = strHttpServerAddr;
+	}
+
+	if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
+		m_iHttpTimeOut = iTimeOut;
+	}
+
+	if (1 == iPostOn) {
+		m_bPostOn = true;
+	}
+
+	SetRecordAudioQuality(iAudioQuality);
+	SetRecordAudioNsPolicy(iAudioNsPolicy);
+	SetRecordAudioChannles(iAudioChannels);
+
+	if (0 != iIsAudioNsOn) {
+		m_bIsAudioNsOn = true;
+	}
+
+	if (1 == iStopEncflag) {
+		m_bEncFlag = false;
+	}
+
+	if (1 == iRemoteRecordType) {
+		m_iRemoteRecordType = 1;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_bEncFlag is %s, m_iRemoteRecordType is %d.", m_bEncFlag ? "true" : "false", m_iRemoteRecordType);
+
+	if (m_bWholeSection != 0 && m_bWholeSection != 1) {
+		m_bWholeSection = false;
+	}
+
+	return Error;
+}
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CSalesRecorderEntity)
 SP_END_ENTITY_MAP()

+ 4 - 1
Module/mod_SalesRecorder/mod_SalesRecorder.h

@@ -93,7 +93,7 @@ namespace SalesRecorder {
 
 		virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 
-		virtual int GetActiveCamera();
+		virtual int GetRecordCamera();
 
 		virtual int GetCameraState();
 
@@ -181,6 +181,8 @@ namespace SalesRecorder {
 
 		ErrorCodeEnum SetRecordCamera(int iCamera);
 
+		ErrorCodeEnum GetEntityConfig();
+
 	private:
 		DeviceTypeEnum m_eDeviceType;
 		int m_iActiveCamera;
@@ -225,6 +227,7 @@ namespace SalesRecorder {
 		vector<record_item_t> m_vRecordList;
 		eRvcBusinessStatus m_eBusinessStatus;
 		bool m_bEncFlag;
+		int m_iRemoteRecordType;
 
 		friend class SalesRecordServiceSession;
 	};

+ 1 - 1
Module/mod_recorder/mod_recorder.cpp

@@ -369,7 +369,7 @@ void CRecorderEntity::vDebug(record_loglevel elevel, const char* str, va_list li
 }
 
 
-int CRecorderEntity::GetActiveCamera()
+int CRecorderEntity::GetRecordCamera()
 {
 	return m_iActiveCamera;
 }

+ 1 - 1
Module/mod_recorder/mod_recorder.h

@@ -51,7 +51,7 @@ namespace Recorder {
 
 		virtual void Debug(record_loglevel elevel, const char* fmt, ...);
 		virtual void vDebug(record_loglevel elevel, const char* str, va_list list);
-		virtual int GetActiveCamera();
+		virtual int GetRecordCamera();
 		virtual void OnRecordFailed(eRvcRecordFailedCase eCase, const char* pszMessage, bool bRecordDevFault);
 		virtual void OnRecordEntityExcption();
 		virtual void OnRecordFinished();

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

@@ -122,7 +122,7 @@ class CHostApi
 public:
 	virtual void Debug(record_loglevel elevel, const char *fmt, ...) = 0;
 	virtual void vDebug(record_loglevel elevel, const char* str, va_list list) = 0;
-	virtual int GetActiveCamera() = 0;
+	virtual int GetRecordCamera() = 0;
 	virtual void OnRecordFailed(eRvcRecordFailedCase eCase, const char *pszMessage, bool bRecordDevFault=false) = 0;
 	virtual void OnRecordEntityExcption() = 0;
 	virtual void OnASectionFinished(const char* pszMessage, int iSerialNum, bool bfinished) = 0;

+ 12 - 8
Other/unix/libvideorecord/libvideorecord_impl.cpp

@@ -444,6 +444,7 @@ libvideorecord_impl::libvideorecord_impl(bool* pResult, CHostApi* pHostAPI, cons
 	m_pFFmpegWriter = NULL;
 	m_pAudioNsObj = NULL;
 	m_bMuteAudio = false;
+	m_bSwitchCam = true;
 
 	*pResult = true;
 }
@@ -1098,7 +1099,7 @@ int libvideorecord_impl::GetStand2SVideoFrameData(videoq_frame* Video, int flags
 
 	int nActiveCam = iInitCam;
 	if (bSwitchCam){
-		nActiveCam = m_pHostApi->GetActiveCamera();
+		nActiveCam = m_pHostApi->GetRecordCamera();
 	}
 
 	if (nActiveCam == 0) {// get env snapshot
@@ -1207,7 +1208,7 @@ int libvideorecord_impl::GetSingleSideVideoFrameData(videoq_frame* Video, int fl
 	memset(Video->data, 0, Video->framesize);
 	int nActiveCam = iInitCam;
 	if (bSwitchCam) {
-		nActiveCam = m_pHostApi->GetActiveCamera();
+		nActiveCam = m_pHostApi->GetRecordCamera();
 	}
 
 	if (0 == nActiveCam) {			// get env snapshot
@@ -1547,6 +1548,7 @@ bool libvideorecord_impl::InitRecordParams()
 	m_bReNameVideo = false;
 
 	m_iRemoteVideoFailedTimes = 0;
+	m_bSwitchCam = true;
 
 	return true;
 }
@@ -1806,20 +1808,22 @@ void libvideorecord_impl::MediaSynchronous()
 int libvideorecord_impl::WriteVideoFrame() 
 {
 	int iret = 0;
-	static bool bSwitchCam = true;
+
 	static int nInitActiveCam = 0;
 
 	bool bVideoLens = (m_opt_videoqueue == NULL) ? (m_env_videoqueue->GetVideoLens() > 0) : ((m_env_videoqueue->GetVideoLens() > 0) || (m_opt_videoqueue->GetVideoLens() > 0));
 	if (bVideoLens) {
 		bool bGetvideo = false;
 		//获取拼接后的视频帧数据
-		if (eStand2Agent == m_eRecordType && bSwitchCam) {
-			bSwitchCam = false;
-			nInitActiveCam = m_pHostApi->GetActiveCamera();
-			m_pHostApi->Debug(RECORD_LOG_INFO, "Stand2S Device Double Record local use %d CAMERA_TYPE_ENV[0] CAMERA_TYPE_OPT[1] Camera.", nInitActiveCam);
+		if (eStand2Agent == m_eRecordType) {
+			if (m_bSwitchCam) {
+				nInitActiveCam = m_pHostApi->GetRecordCamera();
+				m_pHostApi->Debug(RECORD_LOG_INFO, "Stand2S Device Double Record local use %d CAMERA_TYPE_ENV[0] CAMERA_TYPE_OPT[1] Camera.", nInitActiveCam);
+				m_bSwitchCam = false;
+			}
 		}
 
-		int iGetvideo = GetDestTypeVideoFrameData(m_videoframe, VIDEOQUEUE_FLAG_VERTICAL_FLIP, bSwitchCam, nInitActiveCam, m_eRecordType);
+		int iGetvideo = GetDestTypeVideoFrameData(m_videoframe, VIDEOQUEUE_FLAG_VERTICAL_FLIP, m_bSwitchCam, nInitActiveCam, m_eRecordType);
 		//m_pHostApi->Debug(RECORD_LOG_DEBUG, "GetDestTypeVideoFrameData result = %d.", iGetvideo);
 		if (0 != iGetvideo) {
 			if (eStand2Agent == m_eRecordType) {

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

@@ -175,4 +175,5 @@ private:
 	int m_iRemoteAudioBufLen;	    //远端音频拼接BUFFER的当前长度
 	int m_iAudioBufferLen;			//音频录制拼接BUFFER的当前长度
 	int m_iRemoteVideoFailedTimes;	//获取远端视频失败次数
+	bool m_bSwitchCam;				//录制时是否切换摄像头
 };

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

@@ -121,7 +121,7 @@ class CHostApi
 public:
 	virtual void Debug(record_loglevel elevel, const char *fmt, ...) = 0;
 	virtual void vDebug(record_loglevel elevel, const char* str, va_list list) = 0;
-	virtual int GetActiveCamera() = 0;
+	virtual int GetRecordCamera() = 0;
 	virtual void OnRecordFailed(eRvcRecordFailedCase eCase, const char *pszMessage, bool bRecordDevFault=false) = 0;
 	virtual void OnRecordEntityExcption() = 0;
 	virtual void OnASectionFinished(const char* pszMessage, int iSerialNum, bool bfinished) = 0;

+ 7 - 7
Other/win/libvideorecord/libvideorecord_impl.cpp

@@ -953,7 +953,7 @@ int libvideorecord_impl::GetStand2SVideoFrameData(videoq_frame* Video, int flags
 
 	int nActiveCam = iInitCam;
 	if (bSwitchCam){
-		nActiveCam = m_pHostApi->GetActiveCamera();
+		nActiveCam = m_pHostApi->GetRecordCamera();
 	}
 
 	if (nActiveCam == 0) {// get env snapshot
@@ -1047,7 +1047,7 @@ int libvideorecord_impl::GetSingleSideVideoFrameData(videoq_frame* Video, int fl
 
 	int nActiveCam = iInitCam;
 	if (bSwitchCam) {
-		nActiveCam = m_pHostApi->GetActiveCamera();
+		nActiveCam = m_pHostApi->GetRecordCamera();
 	}
 
 	if (0 == nActiveCam) {			// get env snapshot
@@ -1167,10 +1167,10 @@ bool libvideorecord_impl::InitCvxText()
 void libvideorecord_impl::GetVideoFullName()
 {
 	if (m_bWholeSection || !m_bSessionManage) {
-		snprintf(m_VideoFileName, MAX_PATH, "%s%s_%d.%s", m_PathName, m_FileName, m_iFileSerialNum, m_VideoFomat);
+		_snprintf(m_VideoFileName, MAX_PATH, "%s%s_%d.%s", m_PathName, m_FileName, m_iFileSerialNum, m_VideoFomat);
 	}
 	else {
-		snprintf(m_VideoFileName, MAX_PATH, "%s%s_%d_end.%s", m_PathName, m_FileName, m_iFileSerialNum, m_VideoFomat);
+		_snprintf(m_VideoFileName, MAX_PATH, "%s%s_%d_end.%s", m_PathName, m_FileName, m_iFileSerialNum, m_VideoFomat);
 	}
 	m_pHostApi->Debug(RECORD_LOG_DEBUG, "m_VideoFileName = %s", m_VideoFileName);
 }
@@ -1190,12 +1190,12 @@ bool libvideorecord_impl::AddCvxText(unsigned char** pData, int iDataSize, int i
 	if (strlen(m_SubtitleParam.topSubtitleData) <= 0) {
 		if (m_SubtitleParam.bSubtitleSection) {
 			GetLocalTime(&st);
-			sprintf_s(timeSubtitle, MAX_PATH, "%4d年%02d月%02d日 星期%s %02d:%02d:%02d", st.wYear,
+			_snprintf(timeSubtitle, MAX_PATH, "%4d年%02d月%02d日 星期%s %02d:%02d:%02d", st.wYear,
 				st.wMonth, st.wDay, weekDict[st.wDayOfWeek], st.wHour, st.wMinute, st.wSecond);
 		}
 		else {
 			GetLocalTime(&st);
-			sprintf_s(timeSubtitle, MAX_PATH, "%4d/%02d/%02d %02d:%02d:%02d", st.wYear,
+			_snprintf(timeSubtitle, MAX_PATH, "%4d/%02d/%02d %02d:%02d:%02d", st.wYear,
 				st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
 		}
 		m_pText->putText(pImg, timeSubtitle, cvPoint(10, 12));
@@ -1603,7 +1603,7 @@ int libvideorecord_impl::WriteVideoFrame()
 		//获取拼接后的视频帧数据
 		if (eStand2Agent == m_eRecordType && m_bSwitchCam) {
 			m_bSwitchCam = false;
-			nInitActiveCam = m_pHostApi->GetActiveCamera();
+			nInitActiveCam = m_pHostApi->GetRecordCamera();
 			m_pHostApi->Debug(RECORD_LOG_INFO, "Stand2S Device Double Record local use %d CAMERA_TYPE_ENV[0] CAMERA_TYPE_OPT[1] Camera.", nInitActiveCam);
 		}