zoukankan      html  css  js  c++  java
  • Android音视频开发之-WebRTC技术实践

    背景简介

    WebRTC是Google于2011年6月3日开源的即时通讯项目,旨在使其成为客户端视频通话的标准。其实在Google将WebRTC开源之前,微软和苹果各自的通讯产品已占用很大市场份额(如Skype),Google也是为了快速扩大市场,所以将他给开源。经常接触开源的人应该很容易理解Google这种策略,只不过在国内大家都喜欢弄成SDK,然后按年按月按用户数给你收费,总让你觉得不爽,呵呵。

    刚接触WebRTC的时候你会被里面的一堆概念搞晕,特别是对没接触过音视频的人来说,如WebRTC, ICE, STUN, TURN, P2P, NAT, Jingle, TALK, VOIP, FFMPEG, H264, VP8, NACK, RTP, RTCP, RTSP, RTMP, SIP, XMPP, ISAC, ILBC, OPUS, G711, G722. 晕了吧,凡事都要有个过程的,一步步来吧!

    WebRTC被誉为是Web长期开源开发的一个新启元,是近年来web开发的最重要创新。WebRTC允许Web开发者在其web应用中添加视频聊天或者点对点数据传输,不需要复杂的代码或者昂贵的配置。目前支持Chrome、Firefox和Opera,后续会支持更多的浏览器,它有能力达到数十亿的设备。

    然而,WebRTC一直被误解为仅适合于浏览器。事实上,WebRTC最重要的一个特征是允许本地和web应用间的互操作,很少有人使用到这个特性。

    所以自然Android应用也可以植入WebRTC。好处是什么?简单来说就是你可以用很简洁的代码,在手机上实现点对点的音视频通话或者数据传输,点对点,也就是P2P。

    项目准备

    信令服务器搭建:

    • 安装Node.js
    • 进入项目根目录,命令行:npm install
    • 命令行:node app.js
    • 打开浏览器输入127.0.0.1:3000,见到WebRtcServer标题,服务器ready

    1、下载后直接AndroidStudio打开
    2、将WebRtcClient.java类中的mSocketAddress变量改成你服务器的ip端口3000
    3、安装后启动App,如果服务器log显示-- xxxxx joined --证明客户端已连上服务器
    4、至少两个客户端连接到服务器之后,其中一端点击init开始连接

    如果你已经成功跑通了Demo,那么恭喜你已经成功了一半,接下来我们分析下实现流程。

    实现流程

    一、添加WebRTC库依赖
    compile 'org.webrtc:google-webrtc:1.0.+'

    二、初始化核心类PeerConnectionFactory

    PeerConnectionFactory.initialize(PeerConnectionFactory
            .InitializationOptions
            .builder(this)
            .createInitializationOptions());
    

    三、创建PeerConnection对象

        peerConnection = factory.createPeerConnection(
                iceServers, //ICE服务器列表
                constraints, //MediaConstraints
                this); //Context
    

    四、建立P2P连接通道
    WebRTC是基于P2P的,但在端与端之间的连接通道还没建立起来之前,我们需要通过一个信令服务器为端与端之间传递信令建立通道。信令服务器要做的东西很简单,就是将一端的信息透传给另一端,步骤如下(以Demo为例):我们启动A端与B端,通过SocketIO连接到信令服务器,我们以A作为发送端,B为响应端。

    信令交换

    • A向服务器发出init请求
    • 服务器将A的init请求转发给连接上服务器的其他端
    • B收到init请求后,调用peerConnection.createOffer()方法创建一个包含SDP的offer信令
    • offer信令创建成功后会调用SdpObserver监听中的onCreateSuccess()响应函数,在此处B通过peerConnection.setLocalDescription()方法将SDP赋予自己的PeerConnection对象,同时将offer信令发送给服务器
      服务器将offer信令转发给A端
    • A收到offer信令后,调用peerConnection.setRemoteDescription()方法将B发过来的SDP赋予自己的PeerConnection对象,并调用peerConnection.createAnswer()方法创建一个answer信令
      answer信令创建成功后同样会调用SdpObserver监听中的onCreateSuccess()响应函数,在此处A同样通过peerConnection.setLocalDescription方法将SDP赋予自己的PeerConnection对象,同时将answer信令发送给服务器
    • 服务器将answer信令转发给B端
      B收到A的answer信令后,利用peerConnection.setRemoteDescription()方法将A发过来的SDP赋予自己的PeerConnection对象
    • 设置Candidate
      PeerConnection.Observer监听会调用onIceCandidate()响应函数并提供IceCandidate对象。然后将IceCandidate对象组成candidate信令发送给服务器
    • 服务器将candidate信令转发给连接上服务器的其他端
      收到candidate信令后调用peerConnection.addIceCandidate()将IceCandidate赋予自己的PeerConnection对象

    至此Peer-to-Peer的连接已经建立起来了

    五、使用DataChannel收发信息
    初始化DataChannel对象

    /*
    DataChannel.Init 可配参数说明:
    ordered:是否保证顺序传输;
    maxRetransmitTimeMs:重传允许的最长时间;
    maxRetransmits:重传允许的最大次数;
     */
    DataChannel.Init init = new DataChannel.Init();
    dataChannel = peerConnection.createDataChannel("dataChannel", init);
    

    在onDataChannel()回调中注册消息回调

    dataChannel.registerObserver(this);
    

    发送消息

    byte[] msg = message.getBytes();
    DataChannel.Buffer buffer = new DataChannel.Buffer(
            ByteBuffer.wrap(msg),
            false);
    dataChannel.send(buffer);
    

    onMessage()回调收消息

    ByteBuffer data = buffer.data;
    byte[] bytes = new byte[data.capacity()];
    data.get(bytes);
    String msg = new String(bytes);
    

    欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长。

  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/hejunlin/p/12755481.html
Copyright © 2011-2022 走看看