//停止采集
void CSourceManager::StopCapture()
{
	//Stop Capture
// 	m_videoCamera.CloseCamera();
// 	m_audioCapture.Stop();
	
	CloseMP4Writer();

	//停止文件推送
	if(m_pEasyFileCapture)
	{
		m_pEasyFileCapture->StopFileCapture();
		delete m_pEasyFileCapture;
		m_pEasyFileCapture = NULL;
	}

	//清除窗口关联设备
	if (m_pVideoManager)
	{
		Release_VideoCapturer(m_pVideoManager);
		m_pVideoManager = NULL;
	}
	if (m_pAudioManager)
	{
		Release_AudioCapturer(m_pAudioManager);
		m_pAudioManager = NULL;
	}
	m_netStreamCapture.Close();
	
	if (m_hFfeVideoHandle)
	{
		FFE_Deinit(&m_hFfeVideoHandle);
		m_hFfeVideoHandle = NULL;
	}
	if (m_hFfeAudioHandle)
	{
		AAC_Deinit(&m_hFfeAudioHandle);
		m_hFfeAudioHandle = NULL;
	}

	if (m_pEncConfigInfo)
	{
		delete m_pEncConfigInfo;
		m_pEncConfigInfo = NULL;
	}
	m_H264EncoderManager.Clean();
	m_AACEncoderManager.Clean();

	m_nFrameNum = 0;
	if (m_EncoderBuffer)
	{
		delete[] m_EncoderBuffer ;	//申请编码的内存空间
		m_EncoderBuffer = NULL;
	}	


	m_bDSCapture = FALSE;
}
Exemple #2
0
void CMaster::UnInitDSCapture()
{
	//清除窗口关联设备
	for(int nI = 0; nI < m_nDevCount; nI++)
	{
		if (m_pVideoManager[nI])
		{
			Release_VideoCapturer(m_pVideoManager[nI]);
			m_pVideoManager[nI] = NULL;
		}
	}

	if (m_pAudioManager)
	{
		Release_AudioCapturer(m_pAudioManager);
		m_pAudioManager = NULL;
	}
}
int CSourceManager::StartDSCapture(int nCamId, int nAudioId,HWND hShowWnd,int nVideoWidth, int nVideoHeight, int nFps, int nBitRate, char* szDataype, int nSampleRate, int nChannel)
{
	if (m_bDSCapture)
	{
		return 0;
	}

	if(!m_pVideoManager)
	{
		m_pVideoManager = Create_VideoCapturer();
	}
	if(!m_pAudioManager)
	{
		m_pAudioManager = Create_AudioCapturer();
	}
	//设备连接配置信息结构
	memset(&m_sDevConfigInfo, 0x0, sizeof(m_sDevConfigInfo));

	BOOL bUseThread = FALSE;
	int nRet = 0;
	CString strTemp = _T("");
	//连接设备
	// 理论上这里应该有个配置来配置设备的信息 [11/3/2015-13:21:06 Dingshuai]
	//GetDevInfoByDevIndex(nI, &DevConfigInfo);

		//1. 我们来简单配置一个设备信息
		m_sDevConfigInfo.nDeviceId = 1;
		m_sDevConfigInfo.nVideoId = nCamId;//摄像机视频捕获ID
		m_sDevConfigInfo.nAudioId = nAudioId;//音频捕获ID
		m_sDevConfigInfo.VideoInfo.nFrameRate = nFps;
		m_sDevConfigInfo.VideoInfo.nWidth = nVideoWidth;
		m_sDevConfigInfo.VideoInfo.nHeight = nVideoHeight;
		if (szDataype)
		{
			strcpy_s(m_sDevConfigInfo.VideoInfo.strDataType, 64, szDataype);
		}
		else
		{
			strcpy_s(m_sDevConfigInfo.VideoInfo.strDataType, 64, "YUY2");
		}
		m_sDevConfigInfo.VideoInfo.nRenderType = 1;
		m_sDevConfigInfo.VideoInfo.nPinType = 1;
		m_sDevConfigInfo.VideoInfo.nVideoWndId = 0;

		m_sDevConfigInfo.AudioInfo.nAudioBufferType = 4096;
		m_sDevConfigInfo.AudioInfo.nBytesPerSample = 16;
		m_sDevConfigInfo.AudioInfo.nSampleRate = nSampleRate;//44100;//
		m_sDevConfigInfo.AudioInfo.nChannaels = nChannel;
		m_sDevConfigInfo.AudioInfo.nPinType = 2;

		//初始化Pusher结构信息
		memset(&m_mediainfo, 0x00, sizeof(EASY_MEDIA_INFO_T));
		m_mediainfo.u32VideoCodec =  EASY_SDK_VIDEO_CODEC_H264;//0x1C;
		m_mediainfo.u32VideoFps = nFps;
		m_mediainfo.u32AudioCodec = EASY_SDK_AUDIO_CODEC_AAC;
		m_mediainfo.u32AudioChannel = nChannel;
		m_mediainfo.u32AudioSamplerate = nSampleRate;//44100;//
		m_mediainfo.u32AudioBitsPerSample = 16;

		//初始化RGB24->I420色彩空间转换表,便于转换时查询,提高效率
		InitLookupTable();
		//申请编码的内存空间,用作编码后数据的调整
		if (!m_EncoderBuffer)
		{
			m_EncoderBuffer = new char[1920*1080];	
		}	

		if (m_bUseFFEncoder)
		{
			//FFEncoder -- Init start
			int	width = nVideoWidth;
			int height = nVideoHeight;
			int fps = nFps;
			int gop = 30;
			int bitrate = nBitRate*1024;//512000; 
			int	intputformat = 0;		//3:rgb24  0:yv12
			CString strDataType = _T("");
			strDataType = m_sDevConfigInfo.VideoInfo.strDataType;
			if (strDataType == _T("RGB24"))
			{
				intputformat = 3;	
			} 
			else
			{
				intputformat = 0;	
			}

			m_nFrameNum = 0;
			//初始化H264编码器
			FFE_Init(&m_hFfeVideoHandle);	//初始化
			FFE_SetVideoEncodeParam(m_hFfeVideoHandle, ENCODER_H264, width, height, fps, gop, bitrate, intputformat);		//设置编码参数
			//初始化AAC编码器
			AAC_Init(&m_hFfeAudioHandle, nSampleRate/*44100*/, nChannel);
			//FFEncoder -- Init end
		} 
		else
		{
			//x264+faac Encoder --- Init Start
			if(!m_pEncConfigInfo)
				m_pEncConfigInfo = new Encoder_Config_Info;

			m_AACEncoderManager.Init(nSampleRate, nChannel);
			m_pEncConfigInfo->nScrVideoWidth = nVideoWidth;
			m_pEncConfigInfo->nScrVideoHeight = nVideoHeight;
			m_pEncConfigInfo->nFps = nFps;
			m_pEncConfigInfo->nMainKeyFrame = 30;
			m_pEncConfigInfo->nMainBitRate = nBitRate;
			m_pEncConfigInfo->nMainEncLevel = 1;
			m_pEncConfigInfo->nMainEncQuality = 20;
			m_pEncConfigInfo->nMainUseQuality = 0;

			m_H264EncoderManager.Init(0,m_pEncConfigInfo->nScrVideoWidth,
				m_pEncConfigInfo->nScrVideoHeight,m_pEncConfigInfo->nFps,m_pEncConfigInfo->nMainKeyFrame,
				m_pEncConfigInfo->nMainBitRate,m_pEncConfigInfo->nMainEncLevel,
				m_pEncConfigInfo->nMainEncQuality,m_pEncConfigInfo->nMainUseQuality);

			byte  sps[100];
			byte  pps[100];
			long spslen=0;
			long ppslen=0;
			m_H264EncoderManager.GetSPSAndPPS(0,sps,spslen,pps,ppslen);
			memcpy(m_sps, sps,100) ;
			memcpy(m_pps, pps,100) ;
			m_spslen = spslen;
			m_ppslen = ppslen;
			//x264+faac Encoder --- Init End
		}

		//视频可用
		if (m_sDevConfigInfo.nVideoId >= 0)
		{
			HWND hWnd = hShowWnd;		
			// 2.设置视频获取显示参数
			m_pVideoManager->SetVideoCaptureData(0, m_sDevConfigInfo.nVideoId,
				hWnd,
				m_sDevConfigInfo.VideoInfo.nFrameRate,  m_sDevConfigInfo.VideoInfo.nWidth,
				m_sDevConfigInfo.VideoInfo.nHeight,     m_sDevConfigInfo.VideoInfo.strDataType, 
				m_sDevConfigInfo.VideoInfo.nRenderType, m_sDevConfigInfo.VideoInfo.nPinType, 1, bUseThread);

			m_pVideoManager->SetDShowCaptureCallback((RealDataCallback)(CSourceManager::RealDataCallbackFunc), (void*)/*s_pSourceManager*/this);

			// 3.创建获取视频的图像
			nRet =m_pVideoManager->CreateCaptureGraph();
			if(nRet<=0)
			{
				m_pVideoManager->SetCaptureVideoErr(nRet);
				Release_VideoCapturer(m_pVideoManager);
				m_pVideoManager = NULL;

				strTemp.Format(_T("Video[%d]--创建基本链路失败--In StartDSCapture()."), nCamId);
				LogErr(strTemp);
				return -1;
			}
			nRet = m_pVideoManager->BulidPrivewGraph();
			if(nRet<0)
			{
				Release_VideoCapturer(m_pVideoManager);
				m_pVideoManager = NULL;

				strTemp.Format(_T("Video[%d]--连接链路失败--In StartDSCapture()."), nCamId);			
				LogErr(strTemp);
				return -1;
			}
			else
			{
				if (nRet == 2)
				{
					strTemp.Format(_T("Video[%d]--该设备不支持内部回显,将采用外部回显模式!(可能是因为没有可以进行绘制的表面)--In StartDSCapture()."), nCamId);			
					LogErr(strTemp);
				}
				m_pVideoManager->BegineCaptureThread();
			}
		}
		else
		{
			Release_VideoCapturer(m_pVideoManager)	;
			m_pVideoManager = NULL;
			LogErr(_T("当前视频设备不可用!"));
		}

	//音频可用
	if (m_sDevConfigInfo.nAudioId >= 0)
	{
		m_pAudioManager->SetAudioCaptureData(m_sDevConfigInfo.nAudioId, m_sDevConfigInfo.AudioInfo.nChannaels, 
			m_sDevConfigInfo.AudioInfo.nBytesPerSample,  m_sDevConfigInfo.AudioInfo.nSampleRate, 
			m_sDevConfigInfo.AudioInfo.nAudioBufferType, m_sDevConfigInfo.AudioInfo.nPinType, 2, bUseThread);

		m_pAudioManager->SetDShowCaptureCallback((RealDataCallback)(CSourceManager::RealDataCallbackFunc), (void*)this);

		nRet =m_pAudioManager->CreateCaptureGraph();
		if(nRet<=0)
		{
			strTemp.Format(_T("Audio[%d]--创建基本链路失败--In StartDSCapture()."), nAudioId);
			LogErr(strTemp);

			Release_AudioCapturer(m_pAudioManager);
			m_pAudioManager = NULL;
			return -2;
		}
		if (m_pAudioManager)
		{
			nRet = m_pAudioManager->BulidCaptureGraph();
			if(nRet<0)
			{
				strTemp.Format(_T("Audio[%d]--连接链路失败--In StartDSCapture()."), nAudioId);
				LogErr(strTemp);

				Release_AudioCapturer(m_pAudioManager);
				m_pAudioManager = NULL;
				return -2;
			}
			else
			{
				m_pAudioManager->BegineCaptureThread();	
			}
		}
	}	
	else
	{
		LogErr(_T("当前音频设备不可用!"));
	}
	return nRet;
}
Exemple #4
0
int CMaster::StartDSCapture(HWND hShowWnd[], int nWndNum)
{
	//设备连接配置信息结构
	DEVICE_CONFIG_INFO DevConfigInfo;
	memset(&DevConfigInfo, 0x0, sizeof(DevConfigInfo));
	
	m_nDevCount = nWndNum;
	BOOL bUseThread = FALSE;
	int nRet = 0;
	CString strTemp = _T("");
	//连接设备
	for (int nI = 0; nI < m_nDevCount; nI++)
	{
		memset(&DevConfigInfo, 0x0, sizeof(DevConfigInfo));
		// 理论上这里应该有个配置来配置设备的信息 [11/3/2015-13:21:06 Dingshuai]
		//GetDevInfoByDevIndex(nI, &DevConfigInfo);
			
		//我们来简单配置一个设备信息
		DevConfigInfo.nDeviceId = 1;
		DevConfigInfo.nVideoId = 0;
		DevConfigInfo.nAudioId = 0;
		DevConfigInfo.VideoInfo.nFrameRate = 25;
		DevConfigInfo.VideoInfo.nHeight = 480;
		DevConfigInfo.VideoInfo.nWidth = 640;
		_tcscpy_s(DevConfigInfo.VideoInfo.strDataType, MAXNAMESIZE, _T("YUY2"));
		DevConfigInfo.VideoInfo.nRenderType = 1;
		DevConfigInfo.VideoInfo.nPinType = 1;
		DevConfigInfo.VideoInfo.nVideoWndId = nI;

		DevConfigInfo.AudioInfo.nAudioBufferType = 4096;
		DevConfigInfo.AudioInfo.nBytesPerSample = 16;
		DevConfigInfo.AudioInfo.nSampleRate = 44100;
		DevConfigInfo.AudioInfo.nChannaels = 2;
		DevConfigInfo.AudioInfo.nPinType = 2;

		//视频可用
		if (DevConfigInfo.nVideoId >= 0)
		{

			HWND hWnd = hShowWnd[nI];		

			// 2.设置视频获取显示参数
			m_pVideoManager[nI]->SetVideoCaptureData(nI, DevConfigInfo.nVideoId,
				hWnd,
				DevConfigInfo.VideoInfo.nFrameRate,  DevConfigInfo.VideoInfo.nWidth,
				DevConfigInfo.VideoInfo.nHeight,     DevConfigInfo.VideoInfo.strDataType, 
				DevConfigInfo.VideoInfo.nRenderType, DevConfigInfo.VideoInfo.nPinType, 1, bUseThread);

			m_pVideoManager[nI]->SetDShowCaptureCallback((RealDataCallback)(CMaster::RealDataCallbackFunc), (void*)s_pMaster);

			// 3.创建获取视频的图像
			nRet =m_pVideoManager[nI]->CreateCaptureGraph();
			if(nRet<=0)
			{
				strTemp.Format(_T("Video[%d]--创建基本链路失败--In StartDSCapture()."), nI);
				AfxMessageBox(strTemp);
				m_pVideoManager[nI]->SetCaptureVideoErr(nRet);
				//delete m_pVideoManager[nI];
				Release_VideoCapturer(m_pVideoManager[nI]);
				m_pVideoManager[nI] = NULL;
				continue;
				//return -1;
			}
		}

		if (m_pVideoManager[nI])
		{
			nRet = m_pVideoManager[nI]->BulidPrivewGraph();
			if(nRet<0)
			{
				strTemp.Format(_T("Video[%d]--连接链路失败--In StartDSCapture()."), nI);			
				AfxMessageBox(strTemp);
				//delete m_pVideoManager[nI];
				Release_VideoCapturer(m_pVideoManager[nI]);
				m_pVideoManager[nI] = NULL;
				//return -1;
			}
			else
			{
				m_pVideoManager[nI]->BegineCaptureThread();
			}
		}
	}

	//音频可用
	if (DevConfigInfo.nAudioId >= 0)
	{
		m_pAudioManager->SetAudioCaptureData(DevConfigInfo.nAudioId, DevConfigInfo.AudioInfo.nChannaels, 
			DevConfigInfo.AudioInfo.nBytesPerSample,  DevConfigInfo.AudioInfo.nSampleRate, 
			DevConfigInfo.AudioInfo.nAudioBufferType, DevConfigInfo.AudioInfo.nPinType, 2, bUseThread);

		m_pAudioManager->SetDShowCaptureCallback((RealDataCallback)(CMaster::RealDataCallbackFunc), (void*)s_pMaster);

		nRet =m_pAudioManager->CreateCaptureGraph();
		if(nRet<=0)
		{
			strTemp.Format(_T("Audio[%d]--创建基本链路失败--In StartDSCapture()."), 0);
			AfxMessageBox(strTemp);

			Release_AudioCapturer(m_pAudioManager);
			m_pAudioManager = NULL;
			//			return -2;
		}
		if (m_pAudioManager)
		{
			nRet = m_pAudioManager->BulidCaptureGraph();
			if(nRet<0)
			{
				strTemp.Format(_T("Audio[%d]--连接链路失败--In StartDSCapture()."), 0);
				AfxMessageBox(strTemp);

				Release_AudioCapturer(m_pAudioManager);
				m_pAudioManager = NULL;
				//			return -2;
			}
			else
			{
				m_pAudioManager->BegineCaptureThread();	
			}
		}
	}	
	return nRet;

}