WebRTC 实现 Android 传屏 demo

1、WebRTC简介

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或其他任意数据的传输。

目前,WebRTC的应用已经不局限在浏览器与浏览器之间,通过官方提供的SDK,我们可以很容易的实现本地应用间的音视频传输。在Android平台上,我们也非常容易的集成WebRTC框架,用非常简洁的代码就能实现强大、可靠的音视频传输功能。

接下的来的部分,我们会一起搭建Android平台的WebRTC demo,并实现两端之间的局域网传屏功能,同时还支持相互间消息数据的发送。

2、导入WebRTC官方aar

google官方已经提供了打包好的so与java层sdk代码,可方便的直接导入aar包。

implementation 'org.webrtc:google-webrtc:1.0.32006'

如果对api部分或者so底层有修改,想自行发布编译好的aar咋办?在官方源码src/tools_webrtc/android/build_aar.pyrelease_aar.py中有相关生成本地aar与发布aar到maven仓库的脚本。

当然,你也可自行编译so与引入java层sdk代码到项目中。但生成aar的sdk源码并不是放在一个位置,而是分散在WebRTC各个模块中,我们可以通过源码中src/sdk/android/BUILD.gn文件dist_jar("libwebrtc")任务查看相关代码依赖。

3、初始化PeerConnectionFactory

在初次使用PeerConnectionFactory之前,必须调用静态方法initialize()对其进行全局的初始化与资源加载。其中传参InitializationOptions通过内部Builder进行初始化,可对LibraryLoaderTracerLogger等进行设置,一般推荐放在Application中进行调用。

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

4、创建PeerConnectionFactory对象

完成全局初始化后,我们就可以创建PeerConnectionFactory实例了。这个工厂类非常重要,在后续创建连接及音视频采集/编解码中,需要其为我们生成各种重要的组件。如:PeerConnectionVideoSourceVideoTrack等...采用Builder模式对其进行初始化,可方便对其进行编解码器的设置。

final VideoEncoderFactory encoderFactory = new DefaultVideoEncoderFactory(mEglBase.getEglBaseContext(), true, true);
final VideoDecoderFactory decoderFactory = new DefaultVideoDecoderFactory(mEglBase.getEglBaseContext());
mPeerConnectionFactory = PeerConnectionFactory.builder()
        .setVideoEncoderFactory(encoderFactory)
        .setVideoDecoderFactory(decoderFactory)
        .createPeerConnectionFactory();

这里我们采用默认的DefaultVideoEncoderFactoryDefaultVideoDecoderFactory即可,可以简单看下内部的实现,以Decoder为例,其实内部同时支持软解与硬解,首选硬解,若硬解不支持则回退到软解:

public class DefaultVideoDecoderFactory implements VideoDecoderFactory {
  ......
  @Override
  public @Nullable
  VideoDecoder createDecoder(VideoCodecInfo codecType) {
    VideoDecoder softwareDecoder = softwareVideoDecoderFactory.createDecoder(codecType);
    final VideoDecoder hardwareDecoder = hardwareVideoDecoderFactory.createDecoder(codecType);
    if (softwareDecoder == null && platformSoftwareVideoDecoderFactory != null) {
      softwareDecoder = platformSoftwareVideoDecoderFactory.createDecoder(codecType);
    }
    if (hardwareDecoder != null && softwareDecoder != null) {
      // Both hardware and software supported, wrap it in a software fallback
      return new VideoDecoderFallback(
          /* fallback= */ softwareDecoder, /* primary= */ hardwareDecoder);
    }
    return hardwareDecoder != null ? hardwareDecoder : softwareDecoder;
  }
  ......
}

5、通过Factory创建PeerConnection对象

生成了Factory后,我们就可以开始创建PeerConnection对象了。顾名思义,这个类代表点对点之间的连接,可以从远端获取音视频流等数据。在创建之前可以通过RTCConfiguratio

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值