在前面文章中介绍了用 webrtc 打开摄像头并进行画面预览,但这只是有自己的画面,要达到实时通信的目标,还需要另一方的摄像头画面。

简单起见,可以同时打开手机的前后摄像头模拟远程实时通信的画面效果。

当然,不是所有的手机都支持双摄像头同时打开的,经过测试也就小米手机比较合适,比如小米 MIX2S 和小米11系列等。其他手机厂商可能在底层做了某些限制,即使代码上同时调用了前后摄像头,但最终只有一个有画面返回。

具体的代码过程和前面的文章没太大区别,在一个 activity 上布局两个 SurfaceViewRenderer 分别显示前后摄像头画面,然后调用摄像头往这两个控件上填充内容就行。

显示画面布局如下:

localView 显示前置摄像头内容,remoteView 显示后摄像头内容。

创建 VideoCapturer 摄像头代码如下

private fun createVideoCapture(isFront:Boolean): VideoCapturer? {val enumerator = Camera1Enumerator(false)val deviceNames = enumerator.deviceNamesfor (deviceName in deviceNames) {if (if (isFront) enumerator.isFrontFacing(deviceName) else enumerator.isBackFacing(deviceName)) {val videoCapturer: VideoCapturer? = enumerator.createCapturer(deviceName, null)if (videoCapturer != null) {return videoCapturer}}}return null
}

根据参数来选择不同的摄像头。

启用双摄像头同时预览代码如下:

localView = findViewById(R.id.localView)
remoteView = findViewById(R.id.remoteView)val options = PeerConnectionFactory.InitializationOptions.builder(this).createInitializationOptions();
PeerConnectionFactory.initialize(options)
factory = PeerConnectionFactory.builder().createPeerConnectionFactory()val eglBaseContext = EglBase.create().eglBaseContext
val surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext)videoCapture = createVideoCapture(true)videoSource = videoCapture?.isScreencast?.let { factory.createVideoSource(it) }videoCapture?.initialize(surfaceTextureHelper, applicationContext, videoSource?.capturerObserver)
videoCapture?.startCapture(480, 640, 30)localView.setMirror(true)
localView.init(eglBaseContext, null)videoTrack = factory.createVideoTrack("101",videoSource)
videoTrack?.addSink(localView)// remote view
val remoteSurfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext)
remoteVideoCapture = createVideoCapture(false)
remoteVideoSource = remoteVideoCapture?.isScreencast?.let { factory.createVideoSource(it) }remoteVideoCapture?.initialize(remoteSurfaceTextureHelper,applicationContext,remoteVideoSource?.capturerObserver)
remoteVideoCapture?.startCapture(480,640,30)remoteView.setMirror(false)
remoteView.init(eglBaseContext,null)remoteVideoTrack = factory.createVideoTrack("202",remoteVideoSource)
remoteVideoTrack?.addSink(remoteView)

创建摄像头和创建轨道的代码在前一节都已经使用过了,同时启用前后摄像头只不过是将启用单个摄像头的代码重复了一遍,甚至可以将启用摄像头的代码抽出一个方法,就不用写两遍了。

每个摄像头的画面都对应一路视频轨道 videoTrack ,两个轨道之间是没有任何交集的,各自显示自己的内容。

机型允许的条件下,运行应用就可以同时看到前后画面了。

当然,这里只是做一个简单的演示,和实时通信的效果还差得远呢,后续就会让这两个轨道之间互为羁绊,显示对方的画面,达到通信的效果。

这篇文章就先讲到这里,持续更新中,Github 仓库地址后续会给出。

WebRTC 系列文章

  1. WebRTC 系列1--创建相机预览

  2. WebRTC & Android 开发学习环境搭建~

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

NDK 学习进阶免费视频来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

WebRTC 系列2--双摄像头同时预览相关推荐

  1. 小米Android12,小米11系列支持安卓12开发者预览版 还有一加9系列

    原标题:小米11系列支持安卓12开发者预览版 还有一加9系列 [手机中国新闻]北京时间5月19日凌晨,谷歌年度开发者大会落下帷幕,会上公布了Android 12的相关信息,可以用户自定义的主题受到了广 ...

  2. 微信小程序系列——点击图片放大预览

    需求 开发的时候,把图片放到页面上,点击图片没有任何反应,不能放大也不能缩小 这怎么能行!!! 所以需求来了:点击图片能够把图片弹出来,这样就能放大图片看细节了! 实现步骤 微信提供了预览图片的接口, ...

  3. WebRTC 系列1--创建相机预览

    用 WebRTC 创建相机预览,不到 50 行核心代码就可以轻松搞定了. WebRTC 依赖版本 直接使用官方给的版本就好了,不需要再去额外编译. implementation 'org.webrtc ...

  4. SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览

    SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览. 众所周知,System Center Configuration Manager 2007(之前版本有SMS200 ...

  5. C# 海康DVR客户端开发系列(3)—— 连接DVR和图像预览

    前言 一直没有稳定的DVS供我测试用,朋友那边也是频频宕掉,所以延误至今,所幸还是出来了.此外非常遗憾的是没能用WPF实践成功,关键是IntPtr句柄设置不对,没法显示出来,为了保证进度也只好暂时放弃 ...

  6. 【Mac 教程系列第 3 篇】如何用 Mac 预览图工具修改图片的分辨率

    这是[Mac 教程系列第 3 篇],如果觉得有用的话,欢迎关注专栏. 修改图片分辨率,可能你首先想到的是 PS ,其实 Mac 自带的预览图工具就可以修改,下面简单说下修改过程. 第一步 双击打开要修 ...

  7. 基于 WebRTC 的 RTSP 视频实时预览

    WebRTC相关视频讲解: 什么是WebRTC WebRTC入门到精通该怎么学? WebRTC框架剖析 音视频流媒体高级开发:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高 ...

  8. SLAM导航机器人零基础实战系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览...

    SLAM导航机器人零基础实战系列:(二)ROS入门--10.在实际机器人上运行ROS高级功能预览 摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了 ...

  9. 企业微信系列之JSSDK文件预览对接

    企业微信系列之JSSDK文件预览对接 企业微信JS-SDK是企业微信面向网页开发者提供的基于企业微信内的网页开发工具包. 通过使用企业微信JS-SDK,网页开发者可借助企业微信高效地使用拍照.选图.语 ...

  10. DevExpress控件使用系列--ASPxUploadControl(图片上传及预览)

    1.控件功能      列表控件展示数据.弹框控件执行编辑操作.Tab控件实现多标签编辑操官方说明 2.官方示例       2.1 ASPxImage                 http:// ...

最新文章

  1. 计算机视觉:基于YOLO-V3林业病虫害目标检测
  2. VigiBase中搜索和眼病相关的统计数据
  3. 【转】测试人员的思想理念和工作方法
  4. 影响地图:业务敏捷中你需要掌握的可视化力量
  5. vb显示文件列表_VB基本操作题4/150
  6. BW报表igs服务配置解决中文显示问题
  7. 10个常见的Redis面试刁难问题
  8. python车辆型号识别_基于Tensorflow的车辆检测和车型识别
  9. 遗传算法求解TSP问题-python实现
  10. win7系统修复工具_win7系统如何修复
  11. java短信验证码接口demo分享
  12. 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
  13. 如何下载秦皇岛市卫星地图高清版大图
  14. 2017年第26届上海国际连锁加盟展览会会刊(参展商名录)
  15. C4D和Maya哪个学起来更容易
  16. 07 仿网易严选微信小程序商城
  17. sed命令在Mac OS X上出现“未定义标签”错误
  18. python条形码库_python批量生成条形码的示例
  19. 对抗攻击经典论文——FGSM学习笔记 EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
  20. tcpdump显示IP

热门文章

  1. C语言指针的入门pointer
  2. k8s教程(pod篇)-污点与容忍
  3. Diligent推出现代治理应对危险的治理赤字问题,并宣布举办首届现代治理峰会
  4. 《爱和自由》——孩子达到顺从的三个阶段
  5. 编译MKL50.1 (for 一加手机)
  6. mne.io.read_raw_edf()
  7. Unity单人游戏集合
  8. gin结合endless实现热更新
  9. 2022吴恩达机器学习第二周
  10. opencv img.shape