// 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

webRTC windows demo1(转)的更多相关文章

  1. webrtc windows下的编译

    mkdir webrtc-checkoutcd webrtc-checkout set DEPOT_TOOLS_WIN_TOOLCHAIN=0set GYP_GENERATORS=ninjaset G ...

  2. webRTC peerconnection_client demo创建VS工程

    编译了webRTC Windows源码之后,想使用编译出来的库写一个demo出来,但是又不知到怎么下手.就想通过源码中带的示例peerconnection_client和peerconnection_ ...

  3. webRTC源码下载 Windows Mac(iOS) Linux(Android)全

    webRTC源码下载地址:https://pan.baidu.com/s/18CjClvAuz3B9oF33ngbJIw  提取码:wl1e  Windows版:visual studio 2017工 ...

  4. 在Windows下编译WebRTC

    前言 这篇文章的目的在于为你节省生命中宝贵的10小时(甚至更多),或者浪费你10分钟.作为Google更新频繁的大型跨平台基础库,WebRTC的编译一直被人称为噩梦.如果恰巧你偏要在Windows下编 ...

  5. windows下webrtc的编译 2016(转)

    ====================20160124更新============================= 推荐一个FQ工具,shadowsocks,是需要付费的,一年也才不到100块,移 ...

  6. Windows编译运行webrtc全过程

    年纪大了,不想写什么开头.摘要,咱直接开始吧. 不过首先还是要感谢声网提供的webrtc国内源码镜像. 首先,编译webrtc你需要一台win10,而且必须得是一直在更新版本的.因为编译过程需要用到c ...

  7. Android IOS WebRTC 音视频开发总结(三四)-- windows.20150706

    最近好不容易更新了PC版的WEBRTC,总结下有哪些调整,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. 图1:解决方案工程结构对比: 说明: 1, 最大的调整就是移除了VideoE ...

  8. Tips on Building WebRTC on Windows

    Problem: Git ask me to input git user and password Solution: Set environment variable SET DEPOT_TOOL ...

  9. webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理

    Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...

随机推荐

  1. mysql基本知识点

    1.建表格式:create table 表名(字段名 约束条件,字段名 约束条件,...);示例:create table brand(brand_id int unique primary key, ...

  2. 笔记--Day2--python基础2

    一.鸡汤 1.提高自我修养 2.人丑就要多读书 3.多走走,开拓眼界 二.目录: 1.列表.元组操作 2.字符串操作 3.字典操作 dict是无序的 key必须是唯一的 4.集合操作 集合是一个无序的 ...

  3. kubernetes安装rabbitmq集群

    1.准备K8S环境 2.下载基础镜像,需要安装两种插件:autocluster.rabbitmq_management 方法一: 下载已有插件镜像 [root@localhost ~]#docker ...

  4. 购物车小程序(while循环,列表)

    while True: salary = input("please input your salary:") if salary.isdigit(): salary=int (s ...

  5. Python 使用multiprocessing 特别耗内存

    采用multiprocessing多进程进行数据计算的时候内存飚升,这总体可以说是multiprocessing的一个「bug」导致: 大致原因如下: multiprocessing.Process ...

  6. Hadoop4.2HDFS测试报告之二

    第一组:文件存储写过程记录 测试系统组成 存储类型 测试程序或命令 测试文件大小(Mb) 文件个数(个) 客户端并发数(个) 写速率(M/s) NameNode:1 DataNode:1 本地存储 s ...

  7. 深入Python底层,谈谈内存管理机制

    说到内存管理,就先说一下垃圾回收吧.垃圾回收是Python,Java等语言管理内存的一种方式,说的直白些,就是清除无用的垃圾对象.C语言及C++中,需要通过malloc来进行内存的申请,通过free而 ...

  8. 用javascript写计算器

    本人新手,如果有什么不足的地方,希望可以得到指点 今天尝试用javascript写一个计算器 首先把计算器的按钮做出来,用button做好了,这样可以不用设置太多的样式 <button valu ...

  9. Selenium WebDriver-模拟鼠标双击某个元素

    #encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...

  10. 让boostrap的图片轮播支持滑动效果

    因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果. 然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有 ...