// setup video engine
char cCameraName[MAX_CAMERA_NAME_LENGTH];
memset(cCameraName, , MAX_CAMERA_NAME_LENGTH);
int iRet = RET_SUCCESS;
CaptureCapability stCurSelectCapbility; char cCameraID[MAX_CAMERA_ID_LENGTH];
memset(cCameraID, , MAX_CAMERA_ID_LENGTH);
int iCapdeviceCount = ; iCapdeviceCount = m_VieCapture->NumberOfCaptureDevices();
ASSERT(iCapdeviceCount > ); for(int i = ; i < iCapdeviceCount; i++)
{
iRet = m_VieCapture->GetCaptureDevice(i, cCameraName, MAX_CAMERA_NAME_LENGTH, cCameraID, MAX_CAMERA_ID_LENGTH);
ASSERT(iRet == RET_SUCCESS);
int iCapbilityCount = ;
iCapbilityCount = m_VieCapture->NumberOfCapabilities(cCameraID, MAX_CAMERA_ID_LENGTH);
ASSERT(iCapbilityCount > );
iRet = m_VieCapture->GetCaptureCapability(cCameraID, MAX_CAMERA_ID_LENGTH, iCapbilityCount - , stCurSelectCapbility);
ASSERT(iRet == RET_SUCCESS);
}
int iCaptureId;
iRet = m_VieCapture->AllocateCaptureDevice(cCameraID, MAX_CAMERA_ID_LENGTH, iCaptureId);
ASSERT(iRet == RET_SUCCESS); iRet = ViECreateWindow(m_CapRenderHwnd, ,, , ,_T("Local Render"));
ASSERT(iRet == RET_SUCCESS); iRet = ViECreateWindow(m_DecRenderHwnd, , , ,, _T("Remote Render"));
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRender->AddRenderer(iCaptureId,(void*)m_CapRenderHwnd, , 0.0,0.0,1.0,1.0);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieCapture->StartCapture(iCaptureId, stCurSelectCapbility);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRender->StartRender(iCaptureId); VideoCodec videoCodec; int numOfVieCodecs = m_VieCodec->NumberOfCodecs();
bool bFindVideoCode = false; ASSERT(numOfVieCodecs > );
for(int i=; i<numOfVieCodecs;++i)
{
if(m_VieCodec->GetCodec(i,videoCodec)!=-)
{
if(videoCodec.codecType == kVideoCodecVP8)
{
bFindVideoCode = true;
break;
}
}
}
ASSERT(bFindVideoCode); iRet = m_VieBase->CreateChannel(m_ChannelId);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRender->AddRenderer(m_ChannelId,(void*)m_DecRenderHwnd, , 0.0,0.0,1.0,1.0);
ASSERT(iRet == RET_SUCCESS);
iRet = m_VieRender->StartRender(m_ChannelId);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieCodec->SetSendCodec(m_ChannelId, videoCodec);
ASSERT(iRet == RET_SUCCESS);
iRet = m_VieCodec->SetReceiveCodec(m_ChannelId, videoCodec);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieCapture->ConnectCaptureDevice(iCaptureId, m_ChannelId);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRTP_RTCP->SetRTCPStatus(m_ChannelId, webrtc::kRtcpCompound_RFC4585);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRTP_RTCP->SetKeyFrameRequestMethod(m_ChannelId, webrtc::kViEKeyFrameRequestPliRtcp);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieRTP_RTCP->SetTMMBRStatus(m_ChannelId, true);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieNetwork->SetSendDestination(m_ChannelId, "127.0.0.1", , );
ASSERT(iRet == RET_SUCCESS);
iRet = m_VieNetwork->SetLocalReceiver(m_ChannelId, , , "127.0.0.1"); iRet = m_VieBase->StartSend(m_ChannelId);
ASSERT(iRet == RET_SUCCESS); iRet = m_VieBase->StartReceive(m_ChannelId);
ASSERT(iRet == RET_SUCCESS); //setup voice engine
CodecInst voiceCodec; int numOfVoeCodecs = m_VoeCodec->NumOfCodecs();
bool bFindAudioCode = false;
for(int i=; i<numOfVoeCodecs;++i)
{
if(m_VoeCodec->GetCodec(i,voiceCodec)!=-)
{
if(strncmp(voiceCodec.plname,"ISAC",)==)
{
bFindAudioCode = true;
break;
}
}
}
ASSERT(bFindAudioCode);
// define iSAC codec parameters
strcpy(voiceCodec.plname, "ISAC");
voiceCodec.plfreq = ; // iSAC宽带模式
voiceCodec.pltype = ; // 默认动态负载类型
voiceCodec.pacsize = ; // 480kbps,即使用30ms的packet size
voiceCodec.channels = ; // 单声道
voiceCodec.rate = -; // 信道自适应模式,单位bps int iMaxAEChannelNum = m_VoeBase->MaxNumOfChannels();
m_AudioChannel = m_VoeBase->CreateChannel();
ASSERT((m_AudioChannel < iMaxAEChannelNum) && (m_AudioChannel >= )); iRet = m_VoeCodec->SetSendCodec(m_AudioChannel, voiceCodec);
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeRTCP->SetRTCPStatus(m_AudioChannel, true);
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeNetwork->SetSourceFilter(m_AudioChannel, , , "127.0.0.1");
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeBase->SetSendDestination(m_AudioChannel, , "127.0.0.1", -, );
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeBase->SetLocalReceiver(m_AudioChannel, , , "127.0.0.1");
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeBase->StartPlayout(m_AudioChannel);
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeBase->StartReceive(m_AudioChannel);
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeBase->StartSend(m_AudioChannel);
ASSERT(iRet == RET_SUCCESS); NsModes mode(kNsDefault);//
iRet = m_VoeApmPtr->SetRxNsStatus(m_AudioChannel, true, mode);
ASSERT(iRet == RET_SUCCESS); AgcModes agcmode(kAgcDefault);
iRet = m_VoeApmPtr->SetRxAgcStatus(m_AudioChannel, true, agcmode);
ASSERT(iRet == RET_SUCCESS); iRet = m_VoeApmPtr->SetEcStatus(true, kEcAec);
ASSERT(iRet == RET_SUCCESS);
原文转自 http://www.xuebuyuan.com/1719933.html