1,使用

执行peerconnection_server后,服务器默认会监听本地8888端口;执行peerconnection_client,界面会转到现有的用户列表(暂时为空),服务器那边会打印出有新用户连接的消息;再执行一个peerconnection_client,连接到服务器,此时用户列表里就有先前的client,而先前连接的client的用户列表里则会出现新连接上的client;双击client列表里的项,就可以发起与他的连接;之后页面出现两个视频窗口——对方的视频(中)和本地的视频(右下角)。延时非常低,效果不错。但可能听不到声音,因为该例程中声音设备选取的是声音设备列表中的第一个对象,而这通常是“系统声音”。(视频也是默认第一个可以打开的设备)

2,client与server之间的协议

HTTP。当client点击connect之后,客户端给服务器发过去"/sign_in"的get请求,服务器给当前客户列表中的每个都发一遍新用户的信息,格式是"<client_name>,<client_id>,1\r\n",服务器将现有的peers列表信息以如下格式连接"<client_name>,<client_id>,<if_connected?1:0>\r\n"发送给新来的client.得到这些信息后客户端就会把他们显示在pees列表中。客户端每次给服务器发送消息之后都要发送一次"/wait"的get请求,目的是提供response对象,以便服务器在需要给客户端发消息时使用。当客户端双击某个peer发起连接时,会给服务器发来"/message"的post请求,请求的peer_id参数是发起方的id,to参数是要连接的peer的id,内容是sdp信息;服务器把内容转发给相应id的客户端,客户端接收到后解析sdp,得到媒体流信息(是否含音视频,音视频参数等),在本地建立媒体流通道,以便之后接收媒体数据和传给主窗体显示;完了创建本地的sdp,并发回给对方。客户端从STUN/TURN服务器获取本地地址(candidate),经由服务器中转发给对方(同样走/messgae),对方接收到后会向该地址发送消息等待回应以验证是否可连通,联通成功peerconnection就此建立完成,音视频数据就可以通过基于udp的rtp/rtcp协议在peerconnection之间传输。

3,选择视频设备

在conductor.cc中的OpenVideoCaptureDevice函数里。

4,选择音频设备

音频用的是dummydevicemanager,有点坑也不能怪它。首先没有设备枚举,设备池的内容只在一个地方赋了值,DummyDeviceManager(),pushback了一个default进去。所以后面根据设备名选择设备的结果就是只会打开第一个设备(default)。按照他的套路可以这样改,第一给设备池pushback所有设备名(至少你要打开的那一路的索引号要正确),第二在channelmanager.cc的init函数中令audio_in_device_为你要打开的名字。

5,发送本地视频

函数调用流程 :

> peerconnection_client.exe!webrtc::RTPSenderVideo::SendVideo(const webrtc::RtpVideoCodecTypes videoType, const webrtc::FrameType frameType, const char payloadType, const unsigned int captureTimeStamp, __int64 capture_time_ms, const unsigned char * payloadData, const unsigned int payloadSize, const webrtc::RTPFragmentationHeader * fragmentation, webrtc::VideoCodecInformation * codecInfo, const webrtc::RTPVideoTypeHeader * rtpTypeHdr) 行 285 C++

peerconnection_client.exe!webrtc::RTPSender::SendOutgoingData(const webrtc::FrameType frame_type, const char payload_type, const unsigned int capture_timestamp, __int64 capture_time_ms, const unsigned char * payload_data, const unsigned int payload_size, const webrtc::RTPFragmentationHeader * fragmentation, webrtc::VideoCodecInformation * codec_info, const webrtc::RTPVideoTypeHeader * rtp_type_hdr) 行 390 C++

peerconnection_client.exe!webrtc::ModuleRtpRtcpImpl::SendOutgoingData(const webrtc::FrameType frame_type, const char payload_type, const unsigned int time_stamp, __int64 capture_time_ms, const unsigned char * payload_data, const unsigned int payload_size, const webrtc::RTPFragmentationHeader * fragmentation, const webrtc::RTPVideoHeader * rtp_video_hdr) 行 588 C++

peerconnection_client.exe!webrtc::ModuleRtpRtcpImpl::SendOutgoingData(const webrtc::FrameType frame_type, const char payload_type, const unsigned int time_stamp, __int64 capture_time_ms, const unsigned char * payload_data, const unsigned int payload_size, const webrtc::RTPFragmentationHeader * fragmentation, const webrtc::RTPVideoHeader * rtp_video_hdr) 行 641 C++

peerconnection_client.exe!webrtc::ViEEncoder::SendData(webrtc::FrameType frame_type, unsigned char payload_type, unsigned int time_stamp, __int64 capture_time_ms, const unsigned char * payload_data, unsigned int payload_size, const webrtc::RTPFragmentationHeader & fragmentation_header, const webrtc::RTPVideoHeader * rtp_video_hdr) 行 862 C++

peerconnection_client.exe!webrtc::VCMEncodedFrameCallback::Encoded(webrtc::EncodedImage & encodedImage, const webrtc::CodecSpecificInfo * codecSpecificInfo, const webrtc::RTPFragmentationHeader * fragmentationHeader) 行 213 C++

peerconnection_client.exe!webrtc::VP8EncoderImpl::GetEncodedPartitions(const webrtc::I420VideoFrame & input_image) 行 483 C++

peerconnection_client.exe!webrtc::VP8EncoderImpl::Encode(const webrtc::I420VideoFrame & input_image, const webrtc::CodecSpecificInfo * codec_specific_info, const std::vector<enum webrtc::VideoFrameType,std::allocator<enum webrtc::VideoFrameType> > * frame_types) 行 394 C++

peerconnection_client.exe!webrtc::VCMGenericEncoder::Encode(const webrtc::I420VideoFrame & inputFrame, const webrtc::CodecSpecificInfo * codecSpecificInfo, const std::vector<enum webrtc::FrameType,std::allocator<enum webrtc::FrameType> > & frameTypes) 行 66 C++

peerconnection_client.exe!webrtc::vcm::VideoSender::AddVideoFrame(const webrtc::I420VideoFrame & videoFrame, const webrtc::VideoContentMetrics * contentMetrics, const webrtc::CodecSpecificInfo * codecSpecificInfo) 行 325 C++

peerconnection_client.exe!webrtc::`anonymous namespace'::VideoCodingModuleImpl::AddVideoFrame(const webrtc::I420VideoFrame & videoFrame, const webrtc::VideoContentMetrics * contentMetrics, const webrtc::CodecSpecificInfo * codecSpecificInfo) 行 162 C++

peerconnection_client.exe!webrtc::ViEEncoder::DeliverFrame(int id, webrtc::I420VideoFrame * video_frame, int num_csrcs, const unsigned int * CSRC) 行 666 C++

peerconnection_client.exe!webrtc::ViEFrameProviderBase::DeliverFrame(webrtc::I420VideoFrame * video_frame, int num_csrcs, const unsigned int * CSRC) 行 61 C++

peerconnection_client.exe!webrtc::ViECapturer::DeliverI420Frame(webrtc::I420VideoFrame * video_frame) 行 581 C++

peerconnection_client.exe!webrtc::ViECapturer::ViECaptureProcess() 行 519 C++

peerconnection_client.exe!webrtc::ViECapturer::ViECaptureThreadFunction(void * obj) 行 511 C++

peerconnection_client.exe!webrtc::ThreadWindows::Run() 行 170 C++

peerconnection_client.exe!webrtc::ThreadWindows::StartThread(void * lp_parameter) 行 66 C++

[外部代码]

[下面的框架可能不正确和/或缺失,没有为 kernel32.dll 加载符号]

Frame来自于:

> peerconnection_client.exe!webrtc::ViECapturer::OnIncomingCapturedFrame(const int capture_id, webrtc::I420VideoFrame & video_frame) 行 342 C++

peerconnection_client.exe!webrtc::videocapturemodule::VideoCaptureImpl::DeliverCapturedFrame(webrtc::I420VideoFrame & captureFrame, __int64 capture_time) 行 263 C++

peerconnection_client.exe!webrtc::videocapturemodule::VideoCaptureImpl::IncomingFrameI420(const webrtc::VideoFrameI420 & video_frame, __int64 captureTime) 行 383 C++

peerconnection_client.exe!webrtc::ViECapturer::IncomingFrameI420(const webrtc::ViEVideoFrameI420 & video_frame, unsigned __int64 capture_time) 行 336 C++

peerconnection_client.exe!cricket::WebRtcVideoMediaChannel::SendFrame(cricket::WebRtcVideoChannelSendInfo * send_channel, const cricket::VideoFrame * frame, bool is_screencast) 行 2833 C++

peerconnection_client.exe!cricket::WebRtcVideoMediaChannel::AdaptAndSendFrame(cricket::VideoCapturer * capturer, const cricket::VideoFrame * frame) 行 2740 C++

peerconnection_client.exe!sigslot::_connection2<cricket::WebRtcVideoMediaChannel,cricket::VideoCapturer *,cricket::VideoFrame const *,sigslot::multi_threaded_local>::emit(cricket::VideoCapturer * a1, const cricket::VideoFrame * a2) 行 1898 C++

peerconnection_client.exe!sigslot::signal2<cricket::VideoCapturer *,cricket::VideoFrame const *,sigslot::multi_threaded_local>::operator()(cricket::VideoCapturer * a1, const cricket::VideoFrame * a2) 行 2411 C++

peerconnection_client.exe!cricket::VideoCapturer::OnFrameCaptured(cricket::VideoCapturer * __formal, const cricket::CapturedFrame * captured_frame) 行 487 C++

peerconnection_client.exe!sigslot::_connection2<cricket::VideoCapturer,cricket::VideoCapturer *,cricket::CapturedFrame const *,sigslot::multi_threaded_local>::emit(cricket::VideoCapturer * a1, const cricket::CapturedFrame * a2) 行 1898 C++

peerconnection_client.exe!sigslot::signal2<cricket::VideoCapturer *,cricket::CapturedFrame const *,sigslot::multi_threaded_local>::operator()(cricket::VideoCapturer * a1, const cricket::CapturedFrame * a2) 行 2411 C++

peerconnection_client.exe!cricket::WebRtcVideoCapturer::OnIncomingCapturedFrame(const int id, webrtc::I420VideoFrame & sample) 行 340 C++

peerconnection_client.exe!webrtc::videocapturemodule::VideoCaptureImpl::DeliverCapturedFrame(webrtc::I420VideoFrame & captureFrame, __int64 capture_time) 行 263 C++

peerconnection_client.exe!webrtc::videocapturemodule::VideoCaptureImpl::IncomingFrame(unsigned char * videoFrame, int videoFrameLength, const webrtc::VideoCaptureCapability & frameInfo, __int64 captureTime) 行 343 C++

peerconnection_client.exe!webrtc::videocapturemodule::CaptureSinkFilter::ProcessCapturedFrame(unsigned char * pBuffer, int length, const webrtc::VideoCaptureCapability & frameInfo) 行 493 C++

peerconnection_client.exe!webrtc::videocapturemodule::CaptureInputPin::Receive(IMediaSample * pIMediaSample) 行 369 C++

ksproxy.ax!0b84e599() 未知

[下面的框架可能不正确和/或缺失,没有为 ksproxy.ax 加载符号]

简言之:

webrtcvideocapture.cc的OnIncomingCapturedFrame函数中SignalFrameCaptured将帧传给后续处理,这里的frame来自于“采集实现模块”。

6,远程视频直播

获取--解码--转发--传递--绘制

webrtc示例peerconnection_clientserver相关推荐

  1. pion webrtc 示例代码解析 一

    pion webrtc pion 是go语言写的webrtc的开发库套装 DTLS 协议 我们对DTLS 协议要适当的解释,TLS是用于TCP的,而DTLS是用于数据报的,很多应用运行在TCP之上,但 ...

  2. webrtc回声消除线程android,android WebRTC 示例demo源码(回音消除)

    [实例简介] 有相关文档和测试demo,回音消除等处理,学习WebRTC.回音消除的同学可以好好参考 [实例截图] [核心代码] /* * Copyright (c) 2013 The WebRTC ...

  3. TSINGSEE青犀视频构建pion webrtc运行broadcast示例的步骤

    上一篇我们介绍了TSINGSEE青犀团队关于WebRTC Pion音频模块的开发,有兴趣的朋友可以阅读一下:如何添加音频模块并通过浏览器播放.对于Pion WebRTC的开发,我们仍在探索当中,本文将 ...

  4. WebRTC 中收集音视频编解码能力

    在 WebRTC 中,交互的两端在建立连接过程中,需要通过 ICE 协议,交换各自的音视频编解码能力,如编解码器和编解码器的一些参数配置,并协商出一组配置和参数,用于后续的音视频传输过程. 对于音频, ...

  5. 开始使用WebRTC

    Get Started with WebRTC  机翻 原文:Get Started with WebRTC - HTML5 Rocks 无需插件即可进行实时通信 想象一下,在这样一个世界中,您的手机 ...

  6. WebRTC源码研究(1)WebRTC架构

    文章目录 WebRTC源码研究(1)WebRTC架构 1. WebRTC简介 2. WebRTC的能力 2.1 抓住属于WebRTC的5G时代风口 2.1.1 浏览器的支持情况 2.1.2 大厂的加入 ...

  7. WebRTC理论入门

    开篇导读,这篇是从 https://www.html5rocks.com/en/tutorials/webrtc/basics/ 搬运翻译过来的,属于WebRTC理论入门,感觉属于把webrtc说得比 ...

  8. 构建 WebRTC 应用所需的后端服务 STUN, TURN

    Build the backend services needed for a WebRTC app STUN, TURN, and signaling 机翻 原文:Build the backend ...

  9. QUIC DataChannels的第一步

    对于WebRTC,QUIC协议可能提供SCTP之外的替代方案作为DataChannel的传输方式,本文通过示例测试的方式将该方法与WebRTC DataChannels进行了比较.LiveVideoS ...

最新文章

  1. Freemarker商品页面静态化
  2. python自动控制_程序员用Python实现自动化控制键盘和鼠标
  3. js-for (var in )遍历顺序乱了
  4. pytest配置文件pytest.ini
  5. LeetBook《程序员的算法趣题》Q18---水果酥饼日
  6. C语言编程齿轮轮廓线坐标,C语言程序实现齿轮基本参数几何尺寸计算
  7. Excel导入txt数据乱码
  8. 松下电视切换html,松下等离子电视如何用HDMI连接电脑?
  9. mysql时间相减得到天数保留两位_mysql两个日期计算天数
  10. VsCode文件屏蔽
  11. 机器学习推荐算法之关联规则(Apriori)——支持度;置信度;提升度
  12. Python-Django毕业设计老薛男生服装网(程序+LW)
  13. 各种生物识别的优缺点
  14. Unity性能优化要点分析(二) 渲染优化技术
  15. android 模拟器声音设置,逍遥安卓模拟器运行游戏过程中没有声音怎么解决
  16. Debezium的MySQL连接器的工作原理
  17. validate.js
  18. swagger Could not resolve pointer: /definitions/Person does not exist in document
  19. 分析总结常见的几种移动机器人底盘类型及其运动学
  20. golang-泛型基础篇(一)

热门文章

  1. 祝贺:奈雪的茶创始人彭心荣获“深圳首届十大金口碑人物”称号
  2. 【javascript】form提交 不执行onsubmit事件解决方案
  3. HtmlAgilityPack
  4. 展会资讯 | 图扑与您再聚 2022 厦门九八洽谈会
  5. 奥特曼系列ol2020服务器,奥特曼系列ol2020
  6. html改变body的class,详解如何修改el-select的样式:popper-append-to-body和popper-class
  7. 51单片机项目之OLED显示多功能门禁系统(密码、刷卡、指纹、WIFI、蓝牙等)(一)硬件设计
  8. ZeroMemory宏详解
  9. c语言绝对值题目,初中数学绝对值的练习题(整理)
  10. 数字图像处理 张量分解的概念、发展及其应用