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(); } }
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; }