WebRTC 实现 Android 传屏 demo
发布时间:2025-05-13 11:22:18 发布人:远客网络
一、WebRTC 实现 Android 传屏 demo
1、WebRTC是一项实时通讯技术,允许网络应用或站点在浏览器之间不借助中间媒介实现点对点的连接,传输视频流、音频流或其他任意数据。在Android平台上集成WebRTC框架,可以实现强大的音视频传输功能,只需简洁的代码即可。
2、为了实现Android平台的WebRTC demo,并实现两端局域网传屏功能,我们需要搭建相关环境和配置。首先,通过导入WebRTC官方的aar包,方便地引入官方提供的so与java层sdk代码。若需要自行编译aar,可以参考官方源码中的脚本生成本地aar或发布到maven仓库。
3、在使用PeerConnectionFactory之前,必须进行全局初始化与资源加载,通过调用静态方法initialize()并传入InitializationOptions进行配置。完成初始化后,可以创建PeerConnectionFactory实例,这个工厂类在后续的音视频采集、编解码等操作中扮演重要角色。通过Builder模式进行初始化,方便设置编解码器。
4、创建PeerConnection对象是点对点连接的起点,它可以从远端获取音视频流等数据。在创建之前,可以通过RTCConfiguration对连接进行详细配置。同时,通过Factory创建音视频数据源,如AudioSource和VideoSource,但数据来源需在外部实现,如从音频设备捕获或通过特定接口获取视频流。
5、对于视频流,WebRTC提供了多种获取方式,如ScreenCapturerAndroid、CameraCapturer和FileVideoCapturer。通过startCapture()方法开始获取数据,并通过CapturerObserver进行回调。创建VideoTrack和AudioTrack后,通过PeerConnection添加到连接中,以便生成包含相应媒体信息的SDP。
6、建立信令服务器是交换SDP信息的关键步骤。对于局域网场景,可直接使用java Socket实现TCPChannelClient。在进行媒体协商前,需要交换编解码器、传输协议等信息,确保双方支持后,连接才能成功建立。
7、媒体协商过程包括创建Offer和Answer SDP,由呼叫方发起Offer请求,被呼叫方接收并创建Answer回复。当协商成功后,PeerConnection会尝试进行连接,优先选择host方式实现内网间连通。
8、在点对点连接建立后,开始获取音视频流数据。通过onAddStream()回调接收远端的MediaStream对象,其中包含AudioTracks与VideoTracks。通过addSink()与SurfaceViewRenderer绑定,展示远端视频流。
9、在WebRTC中,JavaAudioDeviceModule用于实现音视频的录制与播放,底层采用AudioRecord和AudioTrack。创建PeerConnectionFactory时设置AudioDeviceModule即可。
10、DataChannel专门用于传输音视频流外的数据,如实时文字聊天、文件传输等。通过DataChannel.send()方法相互发送数据,onMessage()回调获取远端发送的数据。DataChannel的创建方式包括In-band与Out-of-band协商,后者在绑定ID一致时更为简便。
二、WebRTC 源码分析 (一) Android 相机采集
本文深入解析了WebRTC在Android平台上的相机采集机制。首先,WebRTC Android环境已整合了原生API(Camera和Camera2)的相机采集,无需额外实现。尽管如此,我们可以通过封装抽象接口(CameraCapturer)实现CameraX,但本文将重点放在从Java到JNI的调用过程解析上。
为了清晰展示整个流程,我们首先借助一个时序图进行概述。图中详细展示了涉及的关键文件,帮助追踪源码。
WebRTC的视频采集接口定义为VideoCapturer,内部封装了初始化(SurfaceTexture渲染帮助类与相机采集回调)、开始/结束/释放等生命周期API,主要实现包括Camera1Capturer和Camera2Capturer。接下来,我们逐步解析WebRTC如何利用Camera1和Camera2进行创建与使用。
若选择使用Camera1进行startCapture,流程将涉及Camera1Session的创建,最终执行Camera.open并进行基础设置,如帧率、采集格式和预览。实例化Camera1Session时,设置SurfaceTexture的缓冲大小(即分辨率)并启动捕获过程。在startCapturing的实现中,调用相机的预览函数,并通过监听TextureFrames实现帧回调。接收到数据后,调用events.onFrameCaptured函数,后续处理在JNI层进行。
Camera2 API于Android API-22引入,旨在支持复杂相机场景,其API相较于Camera1更复杂。使用Camera2进行startCapture时,流程类似于Camera1,主要涉及找到采集格式(如fps范围、分辨率和颜色格式)、打开摄像头等步骤。成功打开摄像头后,执行onOpened函数进行预览设置,包括SurfaceTexture接收数据和调用camera.createCaptureSession与状态回调。至此,Camera1和Camera2的处理流程趋同。
事件回调events.onFrameCaptured调用CameraCapturer#onFrameCaptured函数,并最终传递给VideoSource#onFrameCaptured,数据通过NativeAndroidVideoTrackSource_jni处理,封装为Native端的AndroidVideoTrackSource类,调用内部的OnFrameCaptured函数。经过处理后,数据通过JNI回调至Java端。
在Java端,通过WebSocket连接成功并进入视频通话房间时,调用PeerConnectionClient#createPeerConnection函数,传递本地和远端的VideoSink。在createVideoTrack实现中,创建SurfaceTextureHelper对象,初始化与开始采集,最终回调给Java端的VideoSink进行数据处理。至此,数据从采集到预览的整个流程完整结合。
本文提供了一个从WebRTC源码中抽离的相机采集代码示例,供有兴趣的开发者参考和学习。
总结,本文详细解析了WebRTC Android平台上的相机采集机制,从Java到JNI的调用过程,以及数据的预览与处理流程。对于希望深入理解WebRTC源码的开发者,建议进行实际代码调试。未来,将提供如何在MACOS下搭建WebRTC调试环境的教程。
参考资料:mp.weixin.qq.com/s/D-NM...
三、基于Webrtc的视频通话录制功能-Android实现
1、webrtc本身并不支持视频通话的录制,其SDK仅提供视频数据给开发者,未暴露音频数据。因此,若需进行视频通话录制,需自行修改webrtc SDK,将音频数据引入。
2、第一步,webrtc SDK的下载与编译,相关教程请参考先前的文章。
3、音频采集数据提取:重点关注audio_device_java.jar包中的WebRtcAudioRecord类。添加代码至类的各个方法,以捕获本地音频。
4、音频网络数据提取:同样在audio_device_java.jar包中的WebRtcAudioTrack类进行修改,实现对方音频的获取。
5、编译webrtc,确保audio_device_java.jar包集成至项目。
6、二、整合修改后的SDK,实现视频通话录制功能
7、基于WebRtc的Android示例APP实现,完整代码位于github项目:。
8、视频通话录制主要由MediaRecordController类完成。使用MediaProjection+VirtualDisplay获取视频数据,双路音频采用平均算法混合,使用MediaCodec编码并由MediaMuxer封装为MP4文件。
9、参考先前的文章进行服务器搭建。
10、调整应用配置以连接自建服务器:修改strings.xml与AndroidManifest.xml文件或在应用内直接设置服务器地址。
11、以上流程实现了基于webrtc的视频通话功能与录制,需自行完成SDK修改与服务器搭建,确保功能稳定。