예제 #1
0
void CMaster::InitDSCapture()
{
	if (m_nDevCount <= 0 || m_nDevCount > MAX_DEV)
	{
		m_nDevCount = MAX_DEV;
	}

	for (int nI = 0; nI < m_nDevCount; nI++)
	{
		if(!m_pVideoManager[nI])
		{
			//m_pVideoManager[nI] = new CCaptureVideo();
			m_pVideoManager[nI] = Create_VideoCapturer();
		}

	}
	if(!m_pAudioManager)
	{
		//		m_pAudioManager = new CCaptureAudio();
		m_pAudioManager = Create_AudioCapturer();
	}
}
예제 #2
0
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;
}