瀏覽代碼

Z991239-1954 #comment fix:修改第二次录像从queue获取不到导致录像失败问题

胡琛80272472 4 年之前
父節點
當前提交
98c5aff39e

+ 12 - 1
Module/mod_recorder/CMakeLists.txt

@@ -8,10 +8,21 @@ file(GLOB ${MODULE_PREFIX}_SRCS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
 set(MOD_VERSION_STRING "1.0.0-dev1")
 add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
 
+if(WIN32)
+conan_cmake_run(REQUIRES ffmpeg/4.1.6@LR04.02_ThirdParty/shared
+BASIC_SETUP CMAKE_TARGETS
+BUILD missing)
+else(WIN32)
+conan_cmake_run(REQUIRES ffmpeg/4.1.6@LR04.02_ThirdParty/stable
+BASIC_SETUP CMAKE_TARGETS
+BUILD missing)
+endif(WIN32)
+
 
 # ÒÀÀµlibwmvrecord
 target_include_directories(${MODULE_NAME} PRIVATE
 	${RVC_FRAMEWORK_INCLUDES_DIR}
+    ${CONAN_INCLUDE_DIRS_FFMPEG}
 	${CONAN_RVCFRAMEWORK_ROOT}/include
     ${MODULE_BASE_DIR}
     ${OTHER_LIB_BASE_DIR}/libwmvrecord
@@ -19,7 +30,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
 
 
 set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_LIBS})
-target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} libwmvrecord)  
+target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} ${CONAN_LIB_DIRS_FFMPEG} libwmvrecord)  
 
 target_include_directories(${MODULE_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
 

+ 48 - 33
Module/mod_recorder/mod_recorder.cpp

@@ -15,9 +15,19 @@
 #include <assert.h>
 #include "EventCode.h"
 
+extern "C"
+{
+#include <libavutil/avutil.h>
+}
+
 #define LOG_EVT_UI_RETURNMENU		0x30B00006				//退出到主菜单
 #define LOG_EVT_RECORDFAILED		0x31200001				//录像失败
 
+static void logCallbacks(void* ptr, int level, const char* fmt, va_list list)
+{
+	vDbg(fmt, list);
+}
+
 class CRecorderEntity : public CEntityBase, public CWmvHostApi, public ILogListener,public ISysVarListener
 {
 public:
@@ -37,6 +47,35 @@ public:
 		pTransactionContext->SendAnswer(Error); 
 	}
 
+	BOOL InitRecorder()
+	{
+		BOOL bRet = FALSE;
+
+		if ((ePadtype == m_eDeviceType) || (eMobilePadType == m_eDeviceType) || (eDesk2SType == m_eDeviceType))
+		{
+			//pad 版增加远端视频队列
+			m_pRecorder = new Clibwmvrecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
+				REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, NULL);
+		}
+		else
+		{
+			//  == 2
+			m_pRecorder = new Clibwmvrecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
+				REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
+		}
+		Dbg("init libwmvrecord success!");
+
+		return bRet;
+	}
+
+	BOOL ReleaseRecorder()
+	{
+		if (m_pRecorder) {
+			delete m_pRecorder;
+			m_pRecorder = NULL;
+		}
+	}
+
 	ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
 	{
 		LOG_FUNCTION();
@@ -90,6 +129,8 @@ public:
 		//	LOG_TRACE("decide camera count failed!");
 		//	return Error;
 		//}
+
+		InitRecorder();
 		
 		GetFunction()->SubscribeLog(m_SubIDStartRecord, this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_BEGIN_RECORD, NULL, false);
 		GetFunction()->SubscribeLog(m_SubIDStopRecord, this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_END_RECORD, NULL, false);
@@ -139,6 +180,8 @@ public:
 			m_RecordSaveDir += SPLIT_SLASH_STR;
 		}
 
+		av_log_set_level(AV_LOG_DEBUG);
+		av_log_set_callback(logCallbacks);
 		return Error;
 	}
 
@@ -156,6 +199,8 @@ public:
 		GetFunction()->UnregistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA);
 		GetFunction()->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
 		StopRecord();
+
+		av_log_set_callback(NULL);
 		return Error_Succeed;
 	}
 
@@ -205,35 +250,6 @@ public:
 		Dbg("OnRecordFinished!");
 	}
 
-	BOOL InitRecorder()
-	{
-		BOOL bRet = FALSE;
-
-		if ((ePadtype == m_eDeviceType) || (eMobilePadType == m_eDeviceType) || (eDesk2SType == m_eDeviceType))
-		{
-			//pad 版增加远端视频队列
-			m_pRecorder = new Clibwmvrecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
-				REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, NULL);
-		}
-		else
-		{
-			//  == 2
-			m_pRecorder = new Clibwmvrecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
-				REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
-		}
-		Dbg("init libwmvrecord success!");
-
-		return bRet;
-	}
-
-	BOOL ReleaseRecorder()
-	{
-		if (m_pRecorder){
-			delete m_pRecorder;
-			m_pRecorder = NULL;
-		}
-	}
-
 	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage)
@@ -241,15 +257,14 @@ public:
 		if (/*(dwUserCode == EVENT_MOD_CUSTOMERAWARE_BEGIN)||*/(dwUserCode == EVENT_MOD_BEGIN_RECORD))
 		{ 
 			Dbg("start record!");
-			if (InitRecorder()){
-				StartRecord(pszMessage);
-			}
+			StartRecord(pszMessage);
+
 		} 
 		else if (/*(dwUserCode == EVENT_MOD_CUSTOMERAWARE_END)||*/(dwUserCode == EVENT_MOD_END_RECORD)) 
 		{
 			Dbg("stop record!");
 			StopRecord();
-			ReleaseRecorder();
+			//ReleaseRecorder();
 		}
 		else if (dwUserCode == LOG_EVT_UI_RETURNMENU) // 返回主菜单
 		{

+ 11 - 13
Other/libwmvrecord/FFmpegWriter.cpp

@@ -153,9 +153,11 @@ static BOOL add_stream(LogApi* pLogApi, OutputStream *ost, AVFormatContext *oc,
          * timebase should be 1/framerate and timestamp increments should be
          * identical to 1. */
         ost->st->time_base = (AVRational){ 1, nfps };
+        ost->st->avg_frame_rate = (AVRational){ nfps,  1};
+        c->framerate = (AVRational){ nfps,  1 };
         c->time_base       = ost->st->time_base;
 
-        c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
+        //c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
 		c->pix_fmt       = STREAM_PIX_FMT;
 
         if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
@@ -415,18 +417,13 @@ static BOOL open_video(LogApi* pLogApi, AVFormatContext *oc, AVCodec *codec, Out
 
     av_dict_copy(&opt, opt_arg, 0);
 
-    
-    //huchen add for x264 preset 
-    av_dict_set(&opt, "preset", "fast", 0);
-    //huchen add for x264 tune, zerolatency will set x264 b_vfr_input = 0,we must set b_vfr_input 0 if after encode frame pts don't +1 
-    av_dict_set(&opt, "tune", "zerolatency", 0);
-    av_dict_set(&opt, "x264-params", "ratetol=0.1:force-cfr=true", 0);
-    av_dict_set(&opt, "crf", "28", 0);
-    av_dict_set(&opt, "threads", "1", 0);
-
-    c->max_b_frames = 0;
-    c->level = 30;
-    c->profile = FF_PROFILE_H264_BASELINE;
+    //huchen add for msmpeg4v3
+    //av_dict_set(&opt, "lmin", "1180", 0);
+    //av_dict_set(&opt, "lmax", "2360", 0);
+    c->bit_rate = 128*1000;
+    //c->qmin = 16;
+    //c->qmax = 30;
+    //c->max_b_frames = 0;
 
     c->opaque = pLogApi;
     /* open the codec */
@@ -644,6 +641,7 @@ BOOL FFmpegWmvWriter::InitWmvWriter(char* filename, int width, int height, int c
         return FALSE;
     }
 
+    //av_log_set_level(AV_LOG_DEBUG);
     //av_log_set_callback(log_callback);
     fmt = oc->oformat;
     video_st = new OutputStream();

+ 107 - 42
Other/libwmvrecord/libwmvrecord.cpp

@@ -156,53 +156,42 @@ public:
 		memset(m_FileName,0,MAX_PATH);
 		memset(m_WmvFileName,0,MAX_PATH);
 		memset(m_PathName,0,MAX_PATH);
+		memset(m_audioqueuename, 0, MAX_PATH);
+		memset(m_salesaudioqueuename, 0, MAX_PATH);
+		memset(m_videoqueuename, 0, MAX_PATH);
+		memset(m_videoqueue2name, 0, MAX_PATH);
+		memset(m_remotevideoqueuename, 0, MAX_PATH);
+		memset(m_remoteaudioqueuename, 0, MAX_PATH);
 		//音频传输队列,初始化为空
 		m_salestransqueue = NULL;
 		// 支持现场销售双录使用独立的音频队列 edit by ly@2018/06/13
 		m_audioqueue = NULL;
-		m_localaudioqueue = new Clibaudioqueue((char *)audioqueuename);
+		//m_localaudioqueue = new Clibaudioqueue((char *)audioqueuename);
+		strncpy(m_audioqueuename, audioqueuename, (strlen(audioqueuename) > MAX_PATH) ? (MAX_PATH - 1): strlen(audioqueuename));
+		m_salesaudioqueue = NULL;
 		if (salesaudioqueuename)
 		{
-			m_salesaudioqueue = new Clibaudioqueue((char*)salesaudioqueuename);
+			strncpy(m_salesaudioqueuename, salesaudioqueuename, (strlen(salesaudioqueuename) > MAX_PATH) ? (MAX_PATH - 1) : strlen(salesaudioqueuename));
 		}
-		else
-		{
-			m_salesaudioqueue = NULL;
-		}
-
+		m_videoqueue = NULL;
 		if (videoqueuename)
 		{
-			m_videoqueue = new Clibvideoqueue((char*)videoqueuename);
+			strncpy(m_videoqueuename, videoqueuename, (strlen(videoqueuename) > MAX_PATH) ? (MAX_PATH - 1) : strlen(videoqueuename));
 		}
-		else
-		{
-			m_videoqueue = NULL;
-		}
-
+		m_videoqueue2 = NULL;
 		if (videoqueue2name)
 		{
-			m_videoqueue2 = new Clibvideoqueue((char*)videoqueue2name);
-		}
-		else
-		{
-			m_videoqueue2 = NULL;
+			strncpy(m_videoqueue2name, videoqueue2name, (strlen(videoqueue2name) > MAX_PATH) ? (MAX_PATH - 1) : strlen(videoqueue2name));
 		}
+		m_remotevideoqueue = NULL;
 		if (remotevideoqueuename)
 		{
-			m_remotevideoqueue = new Clibvideoqueue((char*)remotevideoqueuename);
+			strncpy(m_remotevideoqueuename, remotevideoqueuename, (strlen(remotevideoqueuename) > MAX_PATH) ? (MAX_PATH - 1) : strlen(remotevideoqueuename));
 		}
-		else
-		{
-			m_remotevideoqueue = NULL;
-		}
-
+		m_remoteaudioqueue = NULL;
 		if (remoteaudioqueuename)
 		{
-			m_remoteaudioqueue = new Clibaudioqueue((char*)remoteaudioqueuename);
-		}
-		else
-		{
-			m_remoteaudioqueue = NULL;
+			strncpy(m_remoteaudioqueuename, remoteaudioqueuename, (strlen(remoteaudioqueuename) > MAX_PATH) ? (MAX_PATH - 1) : strlen(remoteaudioqueuename));
 		}
 		
 		m_pWriter = NULL;
@@ -221,51 +210,61 @@ public:
 			delete videoframe->data;
 			videoframe->data = NULL;
 		}
+
 		if (videoframe != NULL)
 		{
 			delete videoframe;
 			videoframe = NULL;
 		}
+
 		if (audioframe != NULL)
 		{
 			delete audioframe;
 			audioframe = NULL;
 		}
+
 		if (m_hRecordThread)
 		{
 			m_hRecordThread = NULL;
 		}
+
 		if (m_pWriter!= NULL)
 		{
 			delete m_pWriter;
 			m_pWriter = NULL;
 		}
+
 		if (m_localaudioqueue != NULL)
 		{
 			delete m_localaudioqueue;
 			m_localaudioqueue = NULL;
 		}
+
 		if (m_salesaudioqueue != NULL)
 		{
 			delete m_salesaudioqueue;
 			m_salesaudioqueue = NULL;
 		}
+
 		m_audioqueue = NULL;
 		if (m_remoteaudioqueue != NULL)
 		{
 			delete m_remoteaudioqueue;
 			m_remoteaudioqueue = NULL;
 		}
+
 		if (m_videoqueue != NULL)
 		{
 			delete m_videoqueue;
 			m_videoqueue = NULL;
 		}
+
 		if (m_videoqueue2 != NULL)
 		{
 			delete m_videoqueue2;
 			m_videoqueue2 = NULL;
 		}
+
 		if (m_remotevideoqueue != NULL)
 		{
 			delete m_remotevideoqueue;
@@ -282,18 +281,11 @@ public:
 			m_pAudioNsObj = NULL;
 		}
 
-		//if (m_bIsAudioTransOn){
-		//	Dbg("before delete m_salestransqueue");
-		//if (NULL != m_salestransqueue){
-		//		Dbg("delete m_salestransqueue ing .......");
-		//	delete m_salestransqueue;
-		//	m_salestransqueue = NULL;
-		//	}
-		//	Dbg("after delete m_salestransqueue;");
-		//}
-		//else{
-		//	Dbg("audio trans flag is false.");
-		//}
+		if (NULL != m_salestransqueue){
+			//Dbg("delete m_salestransqueue ing .......");
+			delete m_salestransqueue;
+			m_salestransqueue = NULL;
+		}
 	}
 
 private:
@@ -324,6 +316,12 @@ private:
 	Clibaudioqueue*m_remoteaudioqueue;  //远端音频,用于双向录像,add by chh 20170320
 	Clibaudioqueue*m_localaudioqueue;   //本地音频,add by ly@2018/06/13
 	Clibaudioqueue*m_salesaudioqueue;   //现场销售音频,add by ly@2018/06/13
+	char m_audioqueuename[MAX_PATH];
+	char m_videoqueuename[MAX_PATH];
+	char m_videoqueue2name[MAX_PATH];
+	char m_salesaudioqueuename[MAX_PATH];
+	char m_remotevideoqueuename[MAX_PATH];
+	char m_remoteaudioqueuename[MAX_PATH];
 
 	Clibaudiotransqueue *m_salestransqueue;
 
@@ -369,6 +367,44 @@ private:
 			m_pAudioBufferTmp = NULL;
 			m_iAudioBufferSize = 0;
 		}
+
+		if (m_localaudioqueue != NULL)
+		{
+			delete m_localaudioqueue;
+			m_localaudioqueue = NULL;
+		}
+
+		if (m_salesaudioqueue != NULL)
+		{
+			delete m_salesaudioqueue;
+			m_salesaudioqueue = NULL;
+		}
+
+		m_audioqueue = NULL;
+		if (m_remoteaudioqueue != NULL)
+		{
+			delete m_remoteaudioqueue;
+			m_remoteaudioqueue = NULL;
+		}
+
+		if (m_videoqueue != NULL)
+		{
+			delete m_videoqueue;
+			m_videoqueue = NULL;
+		}
+
+		if (m_videoqueue2 != NULL)
+		{
+			delete m_videoqueue2;
+			m_videoqueue2 = NULL;
+		}
+
+		if (m_remotevideoqueue != NULL)
+		{
+			delete m_remotevideoqueue;
+			m_remotevideoqueue = NULL;
+		}
+
 		return TRUE;
 	}
 
@@ -1402,7 +1438,7 @@ private:
 				{
 					//取音频数据,合并成1S的音频
 					int nAudioLens = m_audioqueue->GetAudioLens();
-					m_pHostApi->Debug("AudioLens: %d!", nAudioLens);
+					//m_pHostApi->Debug("AudioLens: %d!", nAudioLens);
 					if (nAudioLens>0)
 					{
 						if (nAudioBufferLens < nPerSecBufferLens)
@@ -1948,6 +1984,35 @@ public:
 	BOOL StartWmvRecord(int fps,int videoquality,const SubtitleParam *subtitleParam,BOOL bWholeSection,
 		BOOL bSessionManage,const char *pathname,int pathlength,const char *wmvfilename,int filenamelength, Rvc_RecordAudioParam_t* pAudioParam)//开始记录
 	{
+		m_salestransqueue = NULL;
+		m_audioqueue = NULL;
+		m_localaudioqueue = new Clibaudioqueue((char *)m_audioqueuename);
+		m_salesaudioqueue = NULL;
+		if (strlen(m_salesaudioqueuename) != 0)
+		{
+			m_salesaudioqueue = new Clibaudioqueue((char*)m_salesaudioqueuename);
+		}
+		m_videoqueue = NULL;
+		if (strlen(m_videoqueuename) != 0)
+		{
+			m_videoqueue = new Clibvideoqueue((char*)m_videoqueuename);
+		}
+		m_videoqueue2 = NULL;
+		if (strlen(m_videoqueue2name) != 0)
+		{
+			m_videoqueue2 = new Clibvideoqueue((char*)m_videoqueue2name);
+		}
+		m_remotevideoqueue = NULL;
+		if (strlen(m_remotevideoqueuename) != 0)
+		{
+			m_remotevideoqueue = new Clibvideoqueue((char*)m_remotevideoqueuename);
+		}
+		m_remoteaudioqueue = NULL;
+		if (strlen(m_remoteaudioqueuename) != 0)
+		{
+			m_remoteaudioqueue = new Clibaudioqueue((char*)m_remoteaudioqueuename);
+		}
+
 		memset(m_FileName,0,MAX_PATH);
 		memset(m_PathName,0,MAX_PATH);
 		if (filenamelength == 0){