//停止采集 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; }
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; }
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; }