zoukankan      html  css  js  c++  java
  • webRTC windows demo1(转)

        // setup video engine
        char cCameraName[MAX_CAMERA_NAME_LENGTH];
        memset(cCameraName, 0 , MAX_CAMERA_NAME_LENGTH);
        int iRet = RET_SUCCESS;
        CaptureCapability stCurSelectCapbility;
    
        char cCameraID[MAX_CAMERA_ID_LENGTH];
        memset(cCameraID, 0 , MAX_CAMERA_ID_LENGTH);
        int iCapdeviceCount = 0;
        
        iCapdeviceCount = m_VieCapture->NumberOfCaptureDevices();
        ASSERT(iCapdeviceCount > 0);
    
        for(int i = 0; i < iCapdeviceCount; i++)
        {
            iRet = m_VieCapture->GetCaptureDevice(i, cCameraName, MAX_CAMERA_NAME_LENGTH, cCameraID, MAX_CAMERA_ID_LENGTH);
            ASSERT(iRet == RET_SUCCESS);
            int iCapbilityCount = 0;
            iCapbilityCount = m_VieCapture->NumberOfCapabilities(cCameraID, MAX_CAMERA_ID_LENGTH);
            ASSERT(iCapbilityCount > 0);
            iRet = m_VieCapture->GetCaptureCapability(cCameraID, MAX_CAMERA_ID_LENGTH, iCapbilityCount - 1, 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, 500,200, 500, 500,_T("Local Render"));
        ASSERT(iRet == RET_SUCCESS);
        
        iRet = ViECreateWindow(m_DecRenderHwnd, 500, 700, 500,500, _T("Remote Render"));
        ASSERT(iRet == RET_SUCCESS);
     
        iRet = m_VieRender->AddRenderer(iCaptureId,(void*)m_CapRenderHwnd, 0, 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 > 0);
        for(int i=0; i<numOfVieCodecs;++i)  
        {  
            if(m_VieCodec->GetCodec(i,videoCodec)!=-1)  
            {  
                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.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", 11111, 11112);
        ASSERT(iRet == RET_SUCCESS);
        iRet = m_VieNetwork->SetLocalReceiver(m_ChannelId, 11111, 11112, "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=0; i<numOfVoeCodecs;++i)  
        {  
            if(m_VoeCodec->GetCodec(i,voiceCodec)!=-1)  
            {  
                if(strncmp(voiceCodec.plname,"ISAC",4)==0)  
                {
                    bFindAudioCode = true;
                    break;  
                }
            }  
        }  
        ASSERT(bFindAudioCode);
        // define iSAC codec parameters  
        strcpy(voiceCodec.plname, "ISAC");  
        voiceCodec.plfreq   = 16000;    // iSAC宽带模式  
        voiceCodec.pltype   = 103;      // 默认动态负载类型  
        voiceCodec.pacsize  = 480;      // 480kbps,即使用30ms的packet size  
        voiceCodec.channels     = 1;        // 单声道  
        voiceCodec.rate     = -1;       // 信道自适应模式,单位bps 
    
        int iMaxAEChannelNum = m_VoeBase->MaxNumOfChannels();
        m_AudioChannel = m_VoeBase->CreateChannel();
        ASSERT((m_AudioChannel < iMaxAEChannelNum) && (m_AudioChannel >= 0));
        
        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, 11113, 11114, "127.0.0.1");
        ASSERT(iRet == RET_SUCCESS);
        
        iRet = m_VoeBase->SetSendDestination(m_AudioChannel, 11113, "127.0.0.1", -1, 11114);
        ASSERT(iRet == RET_SUCCESS);
    
        iRet = m_VoeBase->SetLocalReceiver(m_AudioChannel, 11113, 11114, "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

  • 相关阅读:
    【百度搜索研发部】以求医为例谈搜索引擎排序算法的基础原理(转)
    TF-IDF与余弦相似性的应用(三):自动摘要
    TF-IDF与余弦相似性的应用(一):自动提取关键词
    TF-IDF与余弦相似性的应用(二):找出相似文章
    技术向:一文读懂卷积神经网络CNN(转)
    [透析] 卷积神经网络CNN究竟是怎样一步一步工作的?(转)
    像素间的基本关系-距离(转)
    Swift学习笔记-字符串和字符(Strings and Characters)-比较字符串 (Comparing Strings)
    Swift学习笔记-基本运算符(Basic Operators)-空合运算符(Nil Coalescing Operator)
    Swift学习笔记-基本运算符(Basic Operators)-求余运算符
  • 原文地址:https://www.cnblogs.com/happykoukou/p/5736071.html
Copyright © 2011-2022 走看看