// 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. 【转】BP神经网络

    学习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中,学习算法的研究有着十分重要的地位.目前,人们所提出的神经网络模型都是和学习算 法相应的.所以,有时人们并不去祈求对模型和算法进行严格 ...

  2. C语言中声明和定义详解(待看。。

    变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. 变量声明:用于向程序表明变量的类型和名字. 定义也是声明,extern声明不是定义 定义也是 ...

  3. 概括的描述一下Spring注册流程

    Spring经过大神们的构思.编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的.源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的 ...

  4. redis学习笔记(2)

    redis学习笔记第二部分 --配置文件介绍 二,解析redis的配置文件redis.conf常见配置参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通 ...

  5. shell 练习题 - 第三周

    1.编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中 #!/bin/bash echo "start backup& ...

  6. Spring AOP注解形式简单实现

    实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi ...

  7. Thinkphp5的安装

    很长没有码代码了,现在开始做这件事情的意义已经完全与以前不一样了.因为最近有相当长的一段休息时间,是个学习的好时间啊.之前接触过TP3.2,听说后来的版本有挺大的改动,因此呢,现在终于有时间可以好好的 ...

  8. Python中的端口协议之基于UDP协议的通信传输

    UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较)        3.利用socketserver模块实现udp传输协议的并 ...

  9. zigbee 中 OSAL 事件传递机制和消息传递机制

    一.概述 OSAL (Operating System Abstraction Layer) ,翻译为"操作系统抽象层". OSAL 就是一种支持多任务运行的系统资源分配机制.OS ...

  10. Mr. Panda and Crystal HDU - 6007 最短路+完全背包

    题目:题目链接 思路:不难看出,合成每个宝石需要消耗一定的魔力值,每个宝石有一定的收益,所以只要我们知道每个宝石合成的最小花费,该题就可以转化为一个背包容量为初始魔力值的完全背包问题,每个宝石的最小花 ...