1,使用
执行peerconnection_server后,服务器默认会监听本地8888端口;执行peerconnection_client,界面会转到现有的用户列表(暂时为空),服务器那边会打印出有新用户连接的消息;再执行一个peerconnection_client,连接到服务器,此时用户列表里就有先前的client,而先前连接的client的用户列表里则会出现新连接上的client;双击client列表里的项,就可以发起与他的连接;之后页面出现两个视频窗口——对方的视频(中)和本地的视频(右下角)。延时非常低,效果不错。但可能听不到声音,因为该例程中声音设备选取的是声音设备列表中的第一个对象,而这通常是“系统声音”。(视频也是默认第一个可以打开的设备)
2,client与server之间的协议
HTTP。当client点击connect之后,客户端给服务器发过去"/sign_in"的get请求,服务器给当前客户列表中的每个都发一遍新用户的信息,格式是"
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
peerconnection_client.exe!webrtc::VCMGenericEncoder::Encode(const webrtc::I420VideoFrame & inputFrame, const webrtc::CodecSpecificInfo * codecSpecificInfo, const std::vector
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
peerconnection_client.exe!sigslot::signal2
peerconnection_client.exe!cricket::VideoCapturer::OnFrameCaptured(cricket::VideoCapturer * __formal, const cricket::CapturedFrame * captured_frame) 行 487 C++
peerconnection_client.exe!sigslot::_connection2
peerconnection_client.exe!sigslot::signal2
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,远程视频直播
获取--解码--转发--传递--绘制
(代码就不贴了)