webrtc示例peerconnection_client&server

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

扫描二维码关注公众号,回复: 9984718 查看本文章

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,远程视频直播

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

发布了21 篇原创文章 · 获赞 110 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/xipiaoyouzi/article/details/100916114