Android IOS WebRTC 音视频开发总结(七)

前面写的一系列总结都是讲webrtc如何下载,编译,开发的,有些人可能有点云里雾里了,WEBRTC不是用来搞跨浏览器开发的吗,怎么我讲的这些跟浏览器扯不上任何关系,其实看看下面这个架构图,你就明白了(本系列文章转载请说明出处:http://www.cnblogs.com/lingyunhu).

我前面讲的这些内容都封装在browser里面了,如音视频的采集,编码,传输,回声消除,丢包重传.所以如果你想将这些功能集成到你的产品里面就必须理解这些东西.

如果你只想做基于浏览器的视频通话功能,上面这些你可以不理解,更不需要去下载编译WEBRTC代码,因为实现这些功能所需要的JS接口浏览器已经帮你实现了,你只需要简单调用即可,我们先看看实现下面这样一个功能主要涉及哪些步骤?

1,信令交互:开始视频通话前发起端和接收端需要一些交互,如通知对方开始视频,接收视频,视频参数协商(SDP信息),NAT地址交换,这个过程我们称之为信令交互,WEBRTC没有定义标准信令格式,既可以使用SIP也可以使用XMPP,还可以使用自定义的信令格式,最简单的方式就是使用websocket或XMLHttpRequest,自定义格式完成信令交互过程.

2,获取本地视频流:navigator.getUserMedia(constraints, successCallback, errorCallback);

navigator.getUserMedia = navigator.getUserMedia ||
  navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
// Callback to be called in case of success...
function successCallback(gotStream) {
video.src = window.URL.createObjectURL(stream);
  // Start playing video
  video.play();
}

// Callback to be called in case of failure...
function errorCallback(error){ console.log("navigator.getUserMedia error: ", error);
}

// Constraints object for low resolution video
var qvgaConstraints = { video: {
    mandatory: {
      maxWidth: 320,
      maxHeight: 240
} }
};

// Constraints object for standard resolution video
var vgaConstraints = { video: {
    mandatory: {
      maxWidth: 640,
      maxHeight: 480
} }
};

// Constraints object for high resolution video
var hdConstraints = { video: {
    mandatory: {
      minWidth: 1280,
      minHeight: 960
} }
};

function getMedia(constraints){
if (!!stream) { video.src = null; stream.stop();
}
  navigator.getUserMedia(constraints, successCallback, errorCallback);
}

3,使用RTCPeerConnection对象在浏览器之间交换媒体流数据.

  1 function call() {
  2   log("Starting call");
  3
  4   // Note well: getVideoTracks() and getAudioTracks() are not currently supported in Firefox...
  5   // ...just use them with Chrome
  6   if (navigator.webkitGetUserMedia) {
  7       // Log info about video and audio device in use
  8       if (localStream.getVideoTracks().length > 0) {
  9         log(‘Using video device: ‘ + localStream.getVideoTracks()[0].label);
 10       }
 11       if (localStream.getAudioTracks().length > 0) {
 12         log(‘Using audio device: ‘ + localStream.getAudioTracks()[0].label);
 13       }
 14   }
 15
 16   // Chrome
 17   if (navigator.webkitGetUserMedia) {
 18       RTCPeerConnection = webkitRTCPeerConnection;
 19   // Firefox
 20   }else if(navigator.mozGetUserMedia){
 21       RTCPeerConnection = mozRTCPeerConnection;
 22       RTCSessionDescription = mozRTCSessionDescription;
 23       RTCIceCandidate = mozRTCIceCandidate;
 24   }
 25   log("RTCPeerConnection object: " + RTCPeerConnection);
 26
 27   // This is an optional configuration string, associated with NAT traversal setup
 28   var servers = null;
 29
 30   // Create the local PeerConnection object
 31   localPeerConnection = new RTCPeerConnection(servers);
 32   log("Created local peer connection object localPeerConnection");
 33   // Add a handler associated with ICE protocol events
 34   localPeerConnection.onicecandidate = gotLocalIceCandidate;
 35
 36   // Create the remote PeerConnection object
 37   remotePeerConnection = new RTCPeerConnection(servers);
 38   log("Created remote peer connection object remotePeerConnection");
 39   // Add a handler associated with ICE protocol events...
 40   remotePeerConnection.onicecandidate = gotRemoteIceCandidate;
 41   // ...and a second handler to be activated as soon as the remote stream becomes available
 42   remotePeerConnection.onaddstream = gotRemoteStream;
 43
 44   // Add the local stream (as returned by getUserMedia() to the local PeerConnection
 45   localPeerConnection.addStream(localStream);
 46   log("Added localStream to localPeerConnection");
 47
 48   // We‘re all set! Create an Offer to be ‘sent‘ to the callee as soon as the local SDP is ready
 49   localPeerConnection.createOffer(gotLocalDescription, onSignalingError);
 50 }
 51
 52 function onSignalingError(error) {
 53     console.log(‘Failed to create signaling message : ‘ + error.name);
 54 }
 55
 56 // Handler to be called when the ‘local‘ SDP becomes available
 57 function gotLocalDescription(description){
 58   // Add the local description to the local PeerConnection
 59   localPeerConnection.setLocalDescription(description);
 60   log("Offer from localPeerConnection: \n" + description.sdp);
 61
 62   // ...do the same with the ‘pseudo-remote‘ PeerConnection
 63   // Note well: this is the part that will have to be changed if you want the communicating peers to become
 64   // remote (which calls for the setup of a proper signaling channel)
 65   remotePeerConnection.setRemoteDescription(description);
 66
 67   // Create the Answer to the received Offer based on the ‘local‘ description
 68   remotePeerConnection.createAnswer(gotRemoteDescription, onSignalingError);
 69 }
 70
 71 // Handler to be called when the ‘remote‘ SDP becomes available
 72 function gotRemoteDescription(description){
 73   // Set the ‘remote‘ description as the local description of the remote PeerConnection
 74   remotePeerConnection.setLocalDescription(description);
 75   log("Answer from remotePeerConnection: \n" + description.sdp);
 76   // Conversely, set the ‘remote‘ description as the remote description of the local PeerConnection
 77   localPeerConnection.setRemoteDescription(description);
 78 }
 79
 80 // Handler to be called as soon as the remote stream becomes available
 81 function gotRemoteStream(event){
 82   // Associate the remote video element with the retrieved stream
 83   if (window.URL) {
 84       // Chrome
 85       remoteVideo.src = window.URL.createObjectURL(event.stream);
 86   } else {
 87       // Firefox
 88       remoteVideo.src = event.stream;
 89   }
 90   log("Received remote stream");
 91 }
 92
 93 // Handler to be called whenever a new local ICE candidate becomes available
 94 function gotLocalIceCandidate(event){
 95   if (event.candidate) {
 96     // Add candidate to the remote PeerConnection
 97     remotePeerConnection.addIceCandidate(new RTCIceCandidate(event.candidate));
 98     log("Local ICE candidate: \n" + event.candidate.candidate);
 99   }
100 }
101
102 // Handler to be called whenever a new ‘remote‘ ICE candidate becomes available
103 function gotRemoteIceCandidate(event){
104   if (event.candidate) {
105     // Add candidate to the local PeerConnection
106     localPeerConnection.addIceCandidate(new RTCIceCandidate(event.candidate));
107     log("Remote ICE candidate: \n " + event.candidate.candidate);
108   }

上面基本上就是浏览器上视频通话涉及的主要对象.

对应到手机端就是webrtc编译成功后的appRTCDemo.apk.

时间: 2024-10-05 23:51:44

Android IOS WebRTC 音视频开发总结(七)的相关文章

转:?Android IOS WebRTC 音视频开发总结 (系列文章集合)

随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). callstats是一家做实时通讯性能测阅读全文 posted @ 2016-07-22 08:24

Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 回顾:Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上) 连接网络摄像头 正如上文所提,我们选用一款简单的D-Link DCS-7010L网络摄像头.关键原因在于它支持RTSP协议,因此服务

Android IOS WebRTC 音视频开发总结(六八)-- Google: What's next for WebRTC

本文主要从用户,公司和技术角度分析美女视频直播这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help Justion和Sarah是google webrtc项目的主要负责人,下面的图片是根据他们分享的内容进行整理的,涉及webrtc进展.优化等方方面面.整理这些资料的过程中我们发现他们对待webrtc还是挺用心的,为webrtc的完善做了很多的工作,谢谢他们! 原始视频时长53分13秒,全英文的,所以我们考虑做

Android IOS WebRTC 音视频开发总结(六)

前段时间在搞IOS的音视频版本,所以将标题改为了Android IOS WebRTC 音视频开发总结, 下面总结一下开发过程中的一些经验: 1. IOS WebRTC音视频编译和下载: 有过android WEBRTC编译下载经验再去弄IOS,你会发现简单多了,再有问题,可以参考:http://www.cnblogs.com/ProbeStar/p/3411510.html  记住有MAC和IOS两个版本,要指定好你想要哪个版本. 2. 正确区分armv7 armv7s i386平台: 编译的时

Android IOS WebRTC 音视频开发总结(二四)

本文主要分析webrtc音视频点对点部分的代码结构,文章来自博客园RTC.Blacker,转载请说明出处. 前段时间在查一个偶尔断线的问题(这种问题最蛋疼,不好重现,只能凭经验去搞),所以理了下webrtc的P2P代码结构,总结如下: 先来张图显示实际会话过程中的两种通讯路径:P2P或转发,92%的情况下是通过P2P实现. 注意:实际通讯过程中每个客户端都会不停地发送和接收Stun包,这样做是为了维护响应的连接和端口. 实际通讯过程中的核心组件为P2PTransportChannel,他代表着本

Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有可能被丢弃:为满足用户对不同应用不同服务质量的要求,就需要网络能根据用户的要求分配和调度资源,对不同的数据流提供不同的服务质量: 1.对实时性强且重要的数据报文优先处理: 2.对于实时性不强的普通数据报文,提供较低的处理优先级,网络拥塞时甚至丢弃. 为了满足上述需求,QoS出现了,定义如下: QoS

Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向

最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什么会这么火? 首先,音视频直播.点播的需求一直大量存在,包括各种行业应用,比如视频门户.娱乐直播.游戏直播.在线教育.远程医疗,远程监控,企业协作,社交应用等等.“以前之所以没有全面爆发,是因为硬件条件不满足,比如网络的带宽有限”,目前网速仍在不断提升,光纤普及到小区,有线网络的上下行带宽已经达到要

Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术

本文主要探讨基于WebRTC的P2P直播粉丝连麦技术 (作者:郝飞,亲加云CTO,编辑:dora),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注微信公众号blacker(微信ID:blackerteam  或 webrtcorgcn) 到目前为止,直播行业继续如预期的那样如火如荼的发展着,在先后竞争完延迟,高清,美 颜,秒开等功能后,最近各大直播平台比拼的一个热点就是连麦.什么是连麦? 简单??述 就是当主播直播期间,可以与其中某一个粉丝进行互动,并且其他粉丝能够观看到这个互动 过程

Android IOS WebRTC 音视频开发总结(四七)-- 深度解读国内首届WebRTC大会背后的真相

本文主要解读国内首届WebRTC大会背后的真相,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help --------------------------------------------------- google于2011年就将WebRTC代码开源了,大会在国外也已经主办好几届了,有声有色,但为什么国内才首次举办呢? 其实国内之前也举办过几次,不过不能叫大会,只能叫内部交流会,因为规格和声势跟这次差几个等级, 有兴趣可以看看我下面这张之前在深圳