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.py
与release_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进行初始化,可对LibraryLoader
、Tracer
、Logger
等进行设置,一般推荐放在Application
中进行调用。
PeerConnectionFactory.initialize(PeerConnectionFactory
.InitializationOptions
.builder(this)
.setEnableInternalTracer(true)
.createInitializationOptions());
4、创建PeerConnectionFactory
对象
完成全局初始化后,我们就可以创建PeerConnectionFactory
实例了。这个工厂类非常重要,在后续创建连接及音视频采集/编解码中,需要其为我们生成各种重要的组件。如:PeerConnection
、VideoSource
、VideoTrack
等...采用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();
这里我们采用默认的DefaultVideoEncoderFactory
和DefaultVideoDecoderFactory
即可,可以简单看下内部的实现,以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