android webRTC 译文

关于WebRTC视频Android端实现的原理解读 进入公司之后做了第一个项目就是关于视频的,因为用的是别人提供的sdk,所以说很容易就能实现其中的功能,那么项目结尾的时候就想着不能光会用,起码得知道原理过程吧!那么下面就讲解一下本人对关于WebRTC的视频连接过程的一些讲解:关于WebRTC这个库。 阅读详情

Android WebRTC 介绍

 

译者说明

由于译者水平有限,翻译尽量遵从原意,一些地方有错误敬请指教。

发布在

这里

原文

https://tech.appear.in/2015/05/25/Introduction-to-WebRTC-on-Android/

翻译

WebRTC被称为开源网络发展的又一大里程碑,被看作为近些年对Web标准的最重要的创新。WebRTC允许开发者在网页应用中添加音视频,并且折不需要复杂的代码和昂贵的其他的基础设备。现在有Chrome、Firfox和Opera都已经支持了WebRTC,并将有更多的浏览器也将会支持,数十亿的设备已经支持了。

然而,WebRTC也被称为城市神话(很多人都相信但实际上并不真实的故事):WebRTC仅仅可以应用在浏览器上。事实上,WebRTC最重要的一个特征是它允许nativ和web app之间的互操作(跨平台)的。很少有人利用这一个特征优势。

这篇Blog将介绍给你如何在你的Android应用中集成WebRTC,使用了WebRTC提供的本地库,提供者:WebRTC Initiative。我们不会强调通过signalling建立连接,而是强调Android和浏览器间的相似和差异。正如你将看到的,将包含一些连接到Web的APIs,如果你想看到更多的基本的关于WebRTC的介绍,请看:Sam Dutton’s Getting started with WebRTC。

在你的项目中添加WebRTC的库

以下内容使用WebRTC库中的9127版本。

第一件事是添加WebRTC库到你的项目中。你可以自己编译这个库,但是相信我,如果可以的话,避免自己编译。相反,使用中央厂库中已经编译好的文件。

为了在你的项目中添加这个文件,需要这样写依赖:

compile 'io.pristine:libjingle:9127@aar'

同步你的项目,你已经拥有了可以使用的库文件了!

权限

就像所有的Android一样,使用这个API你需要声明一些权限。WebRTC也不例外。根据你现在使用的或者是将来会使用的权限,例如音频和视频,你需要设置不同的权限。确保你只请求一次。一个可用的视频聊天应用的权限设置:

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

灯光,相机……

当在浏览器中使用WebRTC时,你可以使用一些很好用的API和文档可以参考:navigator.getUserMedia和RTCPeerConnection包含了大部分你需要的东西。结合video标签,本地和远程数据流一起使用。

幸运的虽然他们有不同的名字,但是在Android这些API也不是很难。在Android中,我们讨论VideoCapturerAndroid、VideoRenderer、MediaStream、PeerConnection和PeerConnectionFactory。我们深入每一个探讨一下。

然而,在你开始做任何这些事情前,需要创建PeerConnectionFactory,Android的WebRTC的核心。

PeerConnectionFactory

WebRTC在Android上所有事情的核心。理解这个类并且知道它如何工作对彻底了解Android上的WebRTC至关重要。它也和你期望的有点不同,因此让我们讨论一下它吧,

首先,初始化PeerConnectionFactory

// First, we initiate the PeerConnectionFactory with
// our application context and some options.
PeerConnectionFactory.initializeAndroidGlobals(
    context,
    initializeAudio,
    initializeVideo,
    videoCodecHwAcceleration,
    renderEGLContext);

为了理解它如何工作,让我们看看每个参数:

context

简单的ApplicationContext,或者任何其他Context相关的上下文对象,跟你以前使用的一致。ing around.

initializeAudio

boolean值,初始化音频部分。

initializeVideo

boolean值,初始化视频部分。跳过这两个中的任何一个,允许你跳过询问API权限。例如DataChannel应用。

videoCodecHwAcceleration

boolean值,是否启用硬件加速。

renderEGLContext

可以提供这个值创建进程支持HW视频编码。可以被设置为null,这样的话就编码视频使用yuv420而不是texture帧。

initializeAndroidGlobals也将返回一个boolean值,正常初始化返回OK,有未初始化成功情况返回false。如果返回false时,是最好的练习的机会。查看源代码获取更多信息。

假设一切正常,你可以使用PeerConnectionFactory的构造函数创建对象,与其他类一样。

PeerConnectionFactory peerConnectionFactory = new PeerConnectionFactory();

接下来获取媒体对象进行渲染

一旦有了peerConnectionFactory实例,就应该从你的设备上获取音频和视频了,最终渲染到屏幕上。在网页上,你有getUserMedia和video可以用。在Android上也很类似,但是需要一点属相在Android上我们讨论:
VideoCapturerAndroid,VideoSource,VideoTrack和VideoRenderer,都是以VideoCapturerAndroid开始。

VideoCapturerAndroid

VideoCapturerAndroid类是一个相机的包装类,提供访问设备相机数据流的江边方法。允许你获取设备数量,获取前置后置摄像头

// Returns the number of camera devices
VideoCapturerAndroid.getDeviceCount();

// Returns the front face device name
VideoCapturerAndroid.getNameOfFrontFacingDevice();
// Returns the back facing device name
VideoCapturerAndroid.getNameOfBackFacingDevice();

// Creates a VideoCapturerAndroid instance for the device name
VideoCapturerAndroid.create(name);

使用VideoCapturerAndroid类的实例,可以创建包含相机视频流的MediaStream,你可以给对方发送数据。在这之前,让我们看看我们怎样在应用中显示我们自己的视频。

VideoSource/VideoTrack

为了从VideoCapture实例中获取有用的东西,获取PeerConnection需要的MediaStream,甚至仅仅使用,你都需要浏览一遍VideoSource和VideoTrack类的代码。

VideoSource可以开始或停止你的设备。在无用停止抓取信息有助于电池使用寿命的延长。

VideoTrack是一个添加VideoSource到MediaStream对象的一个包装。

让我们看看他们一起使用时的代码。capturer是VideoCapturer的实例,videoConstraints是MediaConstraints的实例。

// First we create a VideoSource
VideoSource videoSource =
    peerConnectionFactory.createVideoSource(capturer, videoConstraints);

// Once we have that, we can create our VideoTrack
// Note that VIDEO_TRACK_ID can be any string that uniquely
// identifies that video track in your application
VideoTrack localVideoTrack =
    peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource);

AudioSource/AudioTrack

除了不需要AudioCapturer获取麦克风数据,AudioSource/AudioTrack和VideoSource/VideoTrack很类似。audioConstraints是MediaContraints的实例。

// First we create an AudioSource
AudioSource audioSource =
    peerConnectionFactory.createAudioSource(audioConstraints);

// Once we have that, we can create our AudioTrack
// Note that AUDIO_TRACK_ID can be any string that uniquely
// identifies that audio track in your application
AudioTrack localAudioTrack =
    peerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource);

VideoRenderer

对于浏览器上的WebRTC,你可能很熟悉使用video显示通过getUserMeida获取到的MediaStream到的数据。然而在Android上,没有video标签。跟踪VideoRenderer,WebRTC库允许你实现你自己的方法。然而,也提供了一个很好的默认的方法VideoRendererGui,简单来说,VideoRendererGui是一个GLSurfaceView,在这之上,可以显示视频流。让我们看看如何设置,包括增加我们的renderer到VideoTrack上。

// To create our VideoRenderer, we can use the
// included VideoRendererGui for simplicity
// First we need to set the GLSurfaceView that it should render to
GLSurfaceView videoView = (GLSurfaceView) findViewById(R.id.glview_call);

// Then we set that view, and pass a Runnable
// to run once the surface is ready
VideoRendererGui.setView(videoView, runnable);

// Now that VideoRendererGui is ready, we can get our VideoRenderer
VideoRenderer renderer = VideoRendererGui.createGui(x, y, width, height);

// And finally, with our VideoRenderer ready, we
// can add our renderer to the VideoTrack.
localVideoTrack.addRenderer(renderer);

一个需要注意的是createGui需要四个参数。可以使用一个GLSurfaceView渲染所有的视频。正如看到的,我们使用多个GLSurfaceViews,这意味着x/y将从0到合适的范围内变化。这是有意义的。

MediaConstraints

这个MediaConstraints是WebRTC支持将视频和音频放入MediaStream的方式。看这个支持的规范,大多数方法都需要MediaContraints的实例。

MediaConstraints audioConstraints = new MediaConstraints();

为了定制更多的限制,可以定义键值对,并将他们放到约束列表中。

MediaStream

现在是时候讨论其他部分的功能了。在网页上,我们可能很熟悉MediaStream的概念了,getUserMedia直接返回一个MediaStream,你可以直接将其添加到RTCPeerConnection中发送给对端。对于Android也是一样,除了我们必须创建我们自己的MediaStream。让我们看看我们怎样可以添加VideoTrack和AudioTrack到一个恰当的MediaStream。

// We start out with an empty MediaStream object,
// created with help from our PeerConnectionFactory
// Note that LOCAL_MEDIA_STREAM_ID can be any string
MediaStream mediaStream = peerConnectionFactory.createLocalMediaStream(LOCAL_MEDIA_STREAM_ID);

// Now we can add our tracks.
mediaStream.addTrack(localVideoTrack);
mediaStream.addTrack(localAudioTrack);

你好,有人吗?

我们在一个MediaStream实体中有了音视频流,除了显示在屏幕上,也应该传递给对方了。尽管本文不包括如何创建数据流管道的方法,我们将浏览一遍每个API的方法并解释与Web如何相关。AppRTC使用autobahn使WebRTC连接到信令服务器。我建议你检出项目,详细了解一下Android如何设置信令服务器。

PeerConnection

现在我们有了MediaStream,我们可以连接到对方了,幸运的是这一部分与Web很类似,因此如果你熟悉浏览器上的WebRTC,这部分和直接。在PeerConnectionFactory的帮助下创建一个PeerConnection是容易的。

PeerConnection peerConnection = peerConnectionFactory.createPeerConnection(
    iceServers,
    constraints,
    observer);

参数如下:

iceServers

向连接到外网这个是必要的,添加STUN和TURN服务器可以帮助你连接。

constraints

一个MediaConstrains的实例。应该包含offerToRecieveAudio和offerToRecieveVideo。

observer

一个PeerConnectionObserver的实例。

这个PeerConnection API与web很相似,包括像addStream、addIceCandidate、createOffer、createAnswer、getLocalDescription、setRemoteDescription一类的函数。通过Getting started with WebRTC查看两端怎样一起工作,或者看AppRTC看WebRTC应用怎样工作的。让我们快速的看一下每个函数怎么工作的。

addStream

用来将MediaStream添加到PeerConnection中。如果你想让别人看到你听到你,就需要这个函数。

addCandidate

TODO IceCandidates仅创建一次,允许其他人与你连接。

createOffer/createAnswer

TODO 这两个用来初始化通话设置。

setLocalDescription/setRemoteDescription

TODO 设置SDP。

PeerConnectionObserver

TODO 提供这个PeerConnection事件的观察者。

最后

正如你看到的,当你对Web很熟悉时,这个Android的API是很简单直接的。使用上面的工具,你可以开发一个WebRTC的APP,数百万的设备可以直接使用。

WebRTC开放给我我们所有人,对于开发者免费,对用户免费。它的使用不仅仅在视频聊天,我们也看到在医疗,文件传输甚至在游戏中都有使用。

为了查看WebRTC的例子,检出appear.in在Android和iOS上。它在浏览器上和应用上都完美的工作着,一起八个人在一个房间中都是免费的,不需要安装和登陆。

去吧,创建一些新的不一样的东西吧!



作者:我是任玉琢
链接:https://www.jianshu.com/p/5a67272d7055
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

WebRTC笔记之一:开篇 一.无插件的实时通讯 想像一下,如果你的手机、电视、电脑都可以通过一个平台进行通信,想像一下,你可以在Web应用中轻松地加入视频聊天和p2p数据分享,这就是WebRTC的愿景。 想试一试吗?WebRTC现在已经被集成到Chrome、Opera和Firefox,在apprtc.appspot.com有个简单的视频聊天应用可供测试。 1.在Chrome、Opera或F 阅读详情

相关推荐

Android WebRTC学习

我们讨论了初始化WebRTC、创建PeerConnection、处理媒体流、建立连接以及关闭连接的步骤,并提供了相应的源代码示例。通过学习和掌握这些基本概念和操作,你可以在Android应用程序中实现实时通信功能,如语音通话和视频聊天。在本篇文章中,我们将探讨如何在Android应用程序中学习和使用WebRTC,并提供相应的源代码示例。在WebRTC中,建立连接需要进行信令交换和ICE候选人的收集。由于信令交换和ICE候选人的实现涉及到网络通信和服务器端的操作,超出了本文的范围。

MznkCloud的博客 264

WebRTC本地媒体——约束详解

目录 1. 约束模式(Constraints Pattern) 1.1Constrainable模式的基本概念 1.2 帮助理解约束的几个示例 1.3Capabilities 1.4 Settings 1.5Constrains 和 ConstraintSet 1.6Constraints Pattern接口定义 2 算法 2.1 定义 2.2SelectStting...

ice_ly000的博客 3709

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库02

每个分支下又细分了四个关键方向,并按照“研究对象/焦点、基本问题、核心理论/概念、研究方法、应用/目标、前沿/发展”的框架进行阐述,严格遵循了六级编码体系。在最终整合时,应建立唯一的学科分类编码表(例如,用两位数字或“ART”、“MED”、“ECO”等字母前缀),并确保所有下级编码(尺度、层次、类别、子类、具体项)的逻辑一致性。此回答中的编码为示例,实际系统需据此调整。控制过程(前馈、同期、反馈)、全面质量管理(TQM)、平衡计分卡(BSC)定量(调查、实验)、定性(访谈、民族志)、混合方法、大数据。

weixin_49199313的博客 674

webrtc-媒体设备

记录

coderT的博客 591

π_RL:解锁流匹配VLA强化学习后训练的关键技术与实战解析

本文深入解析了π_RL框架如何通过流匹配(flow matching)与强化学习(RL)的结合,解决视觉语言动作模型(VLA)在后训练中的关键挑战。详细介绍了Flow Noise和Flow SDE两大核心技术,以及它们在机器人控制任务中的实战效果,显著提升了模型的性能、数据效率和泛化能力。

weixin_29061531的博客 220

STM32 使用IO口模拟I2C时序

上一篇《I2C协议详解》 我们了解了I2C的操作流程,这一篇,我们就使用I2C,来对EEPROM进行操作吧。 我们做两种选择: 1.时序由IO口模拟高低电平,需要了解协议并按照协议操作相应的IO口。 2.时序由硬件自行产生,不需要人工干预; 由硬件产生的I2C时序,我们借助Stm32Cube配置实现便可,我们这一篇,抛开Stm32Cube,手撕代码,根据I2C的时序,一步步地实现I2C对...

8937

快速编译出WebRTC for Android 的一次记录

WebRTC for android官网 http://www.webrtc.org/native-code/android  WebRTC 源码地址 作为新手,以前就知道chromium的项目不是好搞的,webrtc就是chromium项目中的一个子项目,在墙内光是同步下载源码都是有点困难的事情(要翻),然后再按照它的操作说明干起来。不同平台下还不同操作,各种晕啊。 好在有人把这些

Jingle的专栏 6274

利用VBA宏实现LightTools仿真数据自动化导出至Excel

本文详细介绍了如何利用VBA宏实现LightTools仿真数据自动化导出至Excel的完整流程。通过调用LTAPI接口,工程师可以自动执行仿真、抓取照度与光强等数值数据、捕获并粘贴仿真图像,从而将重复性工作自动化,显著提升光学设计工作的效率和准确性。

weixin_28314575的博客 499

Android之WebRTC介绍

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

Doris_ding的专栏 1176

风光储并网对电力系统稳定性影响的仿真研究

本文研究了风光储并网对电力系统稳定性的影响,基于MATLAB/Simulink平台搭建了IEEE 9节点测试系统的风光储并网模型。研究对比了光储、风储和风光储三种并网配置在多种干扰下的稳定性表现。结果表明:光储系统对频率变化最敏感,风储系统具有更强的功率波动适应能力,而风光储联合系统通过互补效应展现出最佳综合稳定性。储能系统在所有配置中均显著改善了频率恢复性能,验证了其在新能源并网中的关键支撑作用。研究为高比例可再生能源电力系统的稳定运行提供了仿真依据和技术参考。

huanghm88的专栏 151

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 815

Android 5.0 API 的变化——开发人员注意

Android 5.0 API变化译自http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html—— ByNashLegendSample示例在这里找:https://github.com/googlesamples/原译文在我的github上:https://github.com/Na...

weixin_34379433的博客 499

实验2 存储器设计与实现【计算机组成原理】

实验2 存储器设计与实现【计算机组成原理】

小心星的博客 2398

跨语言实时对话应用技术解析:从ASR、MT到TTS的完整实现

实时语音识别(ASR)与机器翻译(MT)是自然语言处理领域的核心技术,它们通过将语音信号转化为文本,再在不同语言间进行语义转换,实现了跨语言沟通的技术基础。结合语音合成(TTS)技术,能够构建出完整的语音交互闭环,其技术价值在于打破语言壁垒,提升全球化协作与交流的效率。在工程实践中,这类技术栈广泛应用于实时翻译对话、跨国会议、语言学习辅助等场景。本文以“Talkin”类应用为例,深入探讨如何将ASR、MT和TTS三大模块高效集成,构建低延迟、高可用的跨语言实时对话系统,并涵盖API调用、性能优化及隐私安全等

weixin_30291791的博客 412

32、高光谱遥感技术在军事领域的应用解析

高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。

blue的专栏 229

python如何给声音增加回声效果

创建任何声音对象的回声效果。使用sndarray和numpy来创建原始声音的偏移和衰减副本。目前它只是使用硬编码的值来设置回声的数量和延迟。你可以根据自己的需要轻松地重新创建。这段注释说明了make_echo函数的用途和实现方式,即通过pygame的sndarray模块和numpy库来处理声音数据,生成具有回声效果的声音。函数中使用了固定的回声数量和延迟时间,但这些值可以根据用户的需求进行调整。

zhangzhechun的专栏 976

Android端WebRTC本地音视频采集流程源码分析

至此,Android端本地音视频采集流程基本分析结束,可以看出重点在音视频资源的采集,音视频轨和媒体流创建和使用都很简单。如果你没有特殊需求的话使用源码中直接使用的即可。当然你如果有像录音,视频的二次处理等需求,那你就要对各种数据格式了解比较透彻,本文中也提到了音视频的采集部分和视频二次处理方式,下面就是按照自己的需求去修改。后续我也会出一篇关于视频二次处理的博客。如有错误或修改意见,欢迎指正交流。Android端WebRTC本地音视频采集流程源码分析 - 简书。

irainsa的博客 1551

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android音频通道配置文件,如何在连接到多个音频通道时解决Android webRTC音频中的Echo...

我一直在使用libjingle在四个用户之间建立对等连接以共享数据并启动音频通道.大部分时间都可以正常工作,但是有一个用户的回声问题,这使得呼叫非常不稳定并且很难听取用户的意见.我试过添加this.mediaConstraints.optional.add(new MediaConstraints.KeyValuePair("googNoiseSuppression", "true"));this...

weixin_28692867的博客 654

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

WebRTC Android API

WebRTC Android API WebRTC For Android相关的API有VideoCapturerAndroid, VideoRenderer, MediaStream, PeerConnection 和 PeerConnectionFactory等。通过这些功能完善、说明详细的API,可以显示任何想要显示的本地音视频流和远程音视频流。下面我们将逐一讲解。 类图

8512

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WebRTC源码解读一

此文章为个人学习和应用WebRTC的学习理解,有不对的地方希望大家提出来共同学习和进步,谢谢。 PeerConnectionFactory/PeerConnection:整个WebRTC中最核心的类,有了这个类才能获得音视频相关的其他操作。 PeerConnectionFactory类中包含了各种音视频数据的初始化。 PeerConnectionFactory.initializeAndroidGlobals 中初始化了是否初始化音视频,是否硬件加速,是否支持硬件渲染等内容。 PeerCon..

翻肚鱼儿的博客 1360

Android WebRTC简介

Android WebRTC简介 WebRTC简介 WebRTC WebRTC名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。Google于2011年6月3日开源的即时通讯项目,旨在使其成为客户端视...

Charon_Chui的专栏 1万+

Google WebRtc Android 使用详解(包括客户端和服务端代码)

专注于Android开发,分享经验总结,欢迎加入 内容比较多,请耐心阅读 1、Google Webrtc介绍 WebRTC(Web Real-Time Communication)实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Real-Time Communications (RTC))能力。提供了视频会议的核心技术,包...

他晓 7万+
上一篇: Can’t create handler inside thread that has not called Looper.prepare()
下一篇: android apk 加固
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值