- 博客(175)
- 资源 (2)
- 收藏
- 关注
原创 WebRTC系列-视频VideoBroadcaster与视频流
在前面的文章视频的采集流程中,视频数据采集完成后到编码器之前,如果需要渲染处理那里需要两路视频,WebRTC是实现了一个视频分发器VideoBroadcaster;用来分发采集的视频帧;这篇文章主要以iOS为例介绍VideoBroadcaster分发视频流的过程,需要强调的是iOS的本地渲染没有使用VideoBroadcaster,而是直接通过系统提供的预览类直接显示;Android和pc端的实现都是经过流转数据后显示;
2022-12-29 21:00:00
780
原创 WebRTC系列-音频ADM播放采集的停止与开始
上一篇介绍了adm及其相关的模块;这篇文章主要介绍WebRTC中对于adm采集播放的接口及一些相关的控制接口;其中的在WebRTC中是的作用是各个平台具体。
2022-12-09 10:57:20
723
原创 WebRTC系列 -- iOS 音频采集之setParameter参数处理流程
在前面的文章中介绍了视频编码器参数的设置方法;同样的对于音频也可以设置编码的参数,首先说一下对于音频并没有提供设置很多参数的接口,能设置有maxBitrate;在了解其参数的处理流程后,也可以自己加一些编码器的参数设置;在上面的文章中介绍了RTPSender和,及这个两个的关系;音频这一层的关系和调用方式同音频类似;都是在调用(代码在sdk/objc/api/peerconnection/RTCRTPSender.mm中)后然交给RTCSenderBase及其他模块处理;
2022-11-28 20:45:00
634
原创 WebRTC系列 -- iOS 音频采集播放之 ADM、APM和AudioState
WebRTC中提供了对iOS和Android的adm相关接口的封装,其中iOS端的ADM主要类关系如下图:其中是WebRTC对外提供的adm统一接口类,定义了一些常用的接口,AudioDeviceModuleIOS继承这个类并实现其定义的方法,其他端的adm也都是实现这个接口;静态方法Create用于创建实例;RegisterAudioCallback 提供注册采集播放数据回调接口;Init 初始化音频播放/采集设备;启动/停止音频播放/采集设备;
2022-11-21 22:00:00
1107
原创 WebRTC系列 -- iOS 音频采集
在文章中总述了音频的采集和播放流程,接下来将分几篇文章详细分析具体的实现以及,如果实现增加外部数据源;iOS端音频采集是使用,这篇文章不介绍,具体使用点击链接;
2022-11-18 21:00:00
923
原创 WebRTC系列 -- iOS 视频采集(2)
在上一篇文章中,介绍了从摄像头到中视频流的调用流程及其中对视频流的处理;这篇文章将介绍iOS端WebRTC对于H264编码器的封装,及视频流从到硬件编码编码返回编码后的帧到当前类的过程;
2022-11-08 20:00:00
777
2
原创 关于Ubuntu安装Jenkins遇到gpg: no valid OpenPGP data found.
【代码】关于Ubuntu安装Jenkins遇到gpg: no valid OpenPGP data found.
2022-11-07 08:45:15
1446
原创 WebRTC系列-网络之带宽估计和码率估计(4)接收端带宽估计-发送端paced
这篇是接收端带宽评估的最后一篇,在上一篇中分析了在接收端基于丢包的带宽估计处理方法;带宽估计后的值一方面会反馈到编码器控制编码码率,同时也会反馈到节拍器中;
2022-10-28 20:00:00
647
原创 WebRTC系列-网络之带宽估计和码率估计(3)接收端带宽估计-发送端
在上一篇文章主要介绍了接收端带宽估计在接收端根据延迟估计评估发送端的带宽然后通过RTCP发送的过程;这一篇主要介绍WebRTC接收端带宽估计的发送端处理;
2022-10-24 18:20:47
575
原创 WebRTC系列-网络之RTCP请求关键帧(requestKeyFrame)
在多人场景下,当某个用户加入某个会议中,这时候其他热 的视频画面,需要都需哟啊发送给刚进入的这个用户,但是这时候发送的帧不一定是关键帧,也就会造成这个用户无法解码或解码失败的问题;WebRTC采用UDP传输流媒体数据,不可避免存在丢包情况WebRTC在rtcp中加入可请求关键帧的类型;在中定义,属于RTCP反馈消息中的一种,对于在RFC中的定义可以看剑痴大神的文章;
2022-10-22 21:00:00
1277
原创 WebRTC系列-网络之带宽估计和码率估计(2)接收端带宽估计
上一篇介绍了WebRTC中带宽估计整体类关系;也介绍了接收端带宽估计的主要类及关系,这节就从类开始分析源码。
2022-10-20 18:21:37
586
原创 WebRTC系列-网络之带宽估计和码率估计(1)
之前写过一篇WebRTC带宽评估的文章,这篇文章主要介绍设置参数对WebRTC带宽评估接口的影响以及带宽评估后的结果对于音视频编解码器码率的影响;以这篇文章为开篇,接下来重点开始分析WebRTC中的网络模块中的重点拥塞控制及带宽评估;webrtc版本:M76。
2022-10-18 22:00:00
842
原创 WebRTC系列-SDP之setRemoteDescription
是WebRTC中PeerConnection对外的重要接口之一,无论是offer还是answer端,在收到对方的sdp后都需要调用setRemoteDescription()方法,从而将对方的sdp交给WebRTC去处理;在其w3c文档中说明如下:RTCPeerConnection 中的方法 setRemoteDescription() ,是用来将指定的会话描述(Session Description)设置为远程对等方的offer或answer。
2022-10-15 03:30:00
1451
原创 WebRTC系列-SDP之CreateAnswer
熟悉WebRTC使用流程的都知道发起端有两个流程先Createoffer然后setlocalSessionDescription,同样的对于被叫端同样有两个相似的流程就是先调用setremotedesc,然后调用createAnswer产生Answer的sdp,这个sdp和offer的sdp内容类似;
2022-10-14 13:15:00
660
原创 WebRTC系列-SDP之生成sdp文本
在前面的文章),这篇文章介绍了了offer的sdp生成的主要过程,包括相应音视频编解码器收集、WebRTC内部管理类的创建及相关引擎的创建,及sdp类关系的生成,sdp类关系在文章中有详细的讲解,这里把主要类的关系图复制如下:但是offer中创建的这么多sdp相关的一系列的类是如何到的sdp文本的呢?这篇文章主要分析相关类生成sdp文本的过程;
2022-09-30 19:30:00
673
原创 WebRTC系列补充--native重采样
重采样在WebRTC的音频处理中非常的重要,WebRTC中AEC等算法对32000hz以下的音频数据有比较好的处理效果,但是对于各个端采集的音频一般都是48000或44100(CD音质),而且有可能是单声道或多声道的数据;同样播放的数据也是48000或44100等数据;这些都需要WebRTC在编码前后解码后对音频的数据做重采样处理;
2022-09-28 20:00:00
791
原创 WebRTC系列补充--native音量能量计算
在上一篇中我们介绍了WebRTC中怎样设置发大远端的的音频;我们调用getStats的时候在和音频相关的数据里有两个参数和,这两个值表示音量的大小,第一表示声音的级别是0-9,第二个表示声音的数值(0-32767),这章我们看WebRTC中是如何计算音量大小的;在调用getStates获取WebRTC的统计数据的时候,WebRTC中音频远端相关的最终会调用到。
2022-09-23 18:15:00
915
原创 WebRTC系列补充--native音量控制level
其中LocalAudioSource没有实现父类的SetVolume方法,RemoteAudioSource实现了父类的。WebRTC对于音量控制是有两个位置一个是ADM(AudioDeviceModel),如下。从这个jni的实现可以最终调用的是source的SetVolume接口;,nativeSetVolume是一个jni方法,在后面分析,其中。也就是说没有提供本地采集的音量控制,提供了远端音量的控制;和Android不同的是iOS对上层的接口是在。根据代码分析的调试,本地麦克风的是。
2022-09-20 18:00:22
1529
原创 WebRTC系列-SDP之setLocalDescription(2)
上一章节介绍过WebRTC中的很多媒体、网络传输等很多相关的类都是在时候创建,他们之间的调用顺序及关系如下图:上图列出了调用关系图,箭头指示方向表示函数的调用栈方向(忽略了一些其他函数的调用),其中{表示函数内的函数调用;setLocalDescription到ApplyLocalDescription ,是串联的调用关系;重要的逻辑都在中;在ApplyLocalDescription中会调用 图中蓝色字体(红色边框)的三个重要函数:最底层的函数。...
2022-08-31 06:15:00
974
原创 WebRTC系列-SDP之setLocalDescription(1)
上一章我们介绍webrtc中createOffer的实现;看过之前的文章,我们知道在webrtc核心接口的调用顺序中不管是offer端还是answer端,都是核心的,setLocalDescription调用的时候有一个参数是必须传值的,那就是sessionDescription会话描述sdp字符串;...
2022-08-29 08:45:00
784
原创 WebRTC系列-APM参数设置及AudioOption
需要说明的是ios的adm是没有实现BuiltInAECIsAvailable,BuiltInAGCIsAvailable等方法的,所以这里都是返回false;,这里就会设置echo_cancellation为true也就是启用软件的AEC,否则ios这里是直接设置成false,也就是使用VOIP自带的AEC;对于其他平台都是先调用对应的buildin方法判断平台是否开启了对应的算法,如果开启了就调用对应的enable关闭;后续的ApplyConfig参数设置,这里就不做介绍感兴趣的参看源码;
2022-08-23 17:12:28
2114
原创 WebRTC系列-SDP之CreateOffer
在上一篇文章中详细介绍了WebRTC中手机编解码相关信息的流程,且在文章最后总结了一张图,同时在中通过多个图分析的sdp相关类的关系;WebRTC对数据安全有很高的严格,在WebRTC里会先去生成证书,证书生成后才会去生成sdp的流程去生成offer;..............................
2022-08-12 16:56:57
829
原创 WebRTC系列-SDP之编码信息收集
在前面的文章中介绍过sdp,在SPD中有多个m行,我们知道一个m行表示一个媒体信息,例如m=audio表示音频m=video表示视频;而每一个m行都有对应的编码信息,那么这些信息是怎么收集的;通过上节sdp类关系我们知道webrtc中sdp相关类关系,及主要接口调用关系图补充如下这篇主要分析sdp中编码器相关数据的收集;..................
2022-08-01 08:33:43
947
原创 Mac下cmake使用Android编译
按照上面的方式就可以检查是否安装cmake命名行支持;通过文中注释的部分也可以通过brew命令通过brew安装cmake(通过上述脚本中替换DANDROID_ABI的架构类型就可以编译指定架构的库;等文件的环境变量中,由于这里是在camke中使用就不用配置;是必备工具,网上的教程也很多,这里就不再讲述安装过程;下载完成后打开,校验完成后,在安装界面直接把。注释掉原因,测试的时候一直安装失败。对于Android开发来说。这个路径就可以配置到。...
2022-07-27 10:02:54
905
原创 Mac下cmake使用
指定是不是启用bitcode,这个需要根据各自的项目需求设置,NO是不适用bitcode优化;CMakeList.txt中的配置是通用的,编译的目标系统需要在编译命令。上图中是指定了生成编译库的路径后的效果,指定编译库路径的方式在下节介绍;通过上面的判断就可区分出当前编译的是iOS还是MacOS的库,然后通过。很多时候当编译不同平台的库的时候我们希望编译的库放在不通的目录下,是指定目标包含的架构,这里指定了armv7和arm64两个架构;就可以指定编译的二进制库的输出路径;需要注意的是上面的代码需要放在。.
2022-07-21 16:55:14
4218
1
原创 WebRTC系列-SDP之类关系梳理
在上图中ContentInfos、TransportInfos和ContentGroups三个对应的属性name、content_name和semantics_,是同一个,比如semantics_=0,那么其他几个也都是0;在WebRTC中对于sdp的分类,主要有两种会话描述和内容描述,其中内容描述主要分为ContentInfos、TransportInfos和ContentGroups;这篇主要是分析其各个字段在WebRTC的内部类关系,对于sdp的创建,在下一篇文章中分析其流程;............
2022-07-18 09:55:42
327
原创 WebRTC系列-Turn相关实现及SASLprep
为了在服务器上创建分配资源,客户端需要使用 Allocate去请求创建;在图 2 中,客户端向服务器发送没有凭据的 Allocate 请求,由于服务器要求所有请求都是使用 STUN 的长期凭证机制进行身份验证,服务器使用 401(未经授权)错误代码拒绝请求,其中包含服务的信息;然后客户端会再试一次,这次包括凭据(未显示)。 此时,服务器接受 Allocate 请求并返回 Allocate Response消息,包含(除其他外)中继的成功响应及分配给客户端的传输地址。一段时间后,客户端决定刷新分配,这时候需
2022-07-12 14:39:16
382
2
原创 WebRTC系列-H.264预估码率计算
WebRTC源码中对视频的编码数据最终处理都是I420数据,由此可知一帧未编码的数据的大小是:width x height x 1.5 这里的单位是字节,例如:6404801.5 = 460,800Byte ; (VBR下)一般的压缩比一般能达到1:50甚至1:100以上,按照640 480 @ 15fps的计算:一般的影响评估码率的因素主要有以下几种:根据不同的典型应用业务场景,常见的码率限制要求(码率控制的模式),大致总结为以下几种类型: 使用的VideoToolBox框架只支持ABR模式。设置
2022-07-05 16:14:09
796
原创 WebRTC系列-网络传输之本地scoket端口
在前面的网络系列文章中,我们知道本地的(也就是本地的一个candidate),是在中创建然后存储 在AllocationSequence中,在方法中就创建了,其中创建相关的源码如下:这里的逻辑是如果没有设置,也就是不是共享socket,可以看到参数里使用有两个min_port()和max_port(),他们都是通过session_->allocator()获取,这里的session是,allocator()在BasicPortAllocatorSession中是在其构造中赋值,BasicPortAlloc
2022-06-30 11:46:29
1088
原创 WebRTC系列-网络传输之8-连通性检测
接下来就是对选择出来的Connection进行连通性检测函数,连通性检测的流程如下:就上图所示,右侧是发送ping包的流程,左侧是接收数据的处理流程;核心流程是一段发送一个ping包,然后收到一个响应包进行处理;其中涉及的函数,在接下来的文章中分析;在中的实现代码如下:这个函数里主要是判断是不是已经开始ping了,如果已经开始及不处理,否则遍历Connections找到可以ping的Connection,切换线程后执行方法,同时调用的,regathering_controller_的类里主要实现定期
2022-06-28 16:25:00
513
原创 WebRTC系列-网络传输之7-ICE补充之提名(nomination)与ICE_Model
在ice文档rfc5245的2.6中介绍了提名,如下:控制端通过使用以下两种方式之一来提名 ICE 选择的配对:常规(regular)提名或激进(aggressive)提名。在ICE 文档中常规提名的列举方式列举如下:从上图中常规提名的流程有以下几步:通过以上三步交互就完成了L向R的常规提名;在ICE 文档中激进提名的列举方式列举如下:与常规不同的区别是;发送StunRequest的时候就加上flag,在收到后就给回复一个Response消息;接着只需要再发送一个StunRequest消息,回复后
2022-06-26 16:59:22
447
原创 WebRTC系列-网络传输之6-Connections裁剪
Connections的裁剪一定是在排序完成后才能进行;在webrtc源码中裁剪操作也是放在排序完成后才开开始切换;
2022-06-24 20:00:00
530
原创 WebRTC系列-网络传输之7-ICE补充之偏好(preference)与优先级(priority)
在RFC 5245文档的4.1.2.2中有一个关于选择类型和本地首选项的指南的章节。其中主要介绍了几种情况下的ice偏好的设置指导:在webrtc里的使用是默认根据和对端的协商的可能性来确定偏好,也就是按照条件1,默认是: ;这个的定义是在文件的函数,其中实现如下:通过文章WebRTC系列-网络传输2之Candidate的收集及PortAllocator(二)我们知道最终的构造candidate是在方法中,那么断点调试后的结果:更多的就不再截图,感兴趣的可以自己加断点调试在第一节中我们知道了ice中的
2022-06-24 17:43:23
1064
原创 WebRTC系列-网络传输之5选择最优connection切换
在上一篇[WebRTC系列-网络传输之4Connection排序](https://blog.csdn.net/lym594887256/article/details/125347739)中分析webrtc中如何实现connections的排序,一般排序在第一位基本就是最优的,但是webrtc中为了处理一些特殊情况,实际的切换逻辑还是很复杂;这节就主要分析webrtc如何选择最优的网络,并切换到最优网络;............
2022-06-23 19:30:00
503
原创 WebRTC系列-网络传输之4Connection排序
通过前面的系列文章,在webrtc中本地设备的每个网络信息是一个`Port`,远端每个网络信息叫做`Candidate`,对于每个port和Candidate都有relay,host,reflex等几种,那么port和connection的组合就有很多种可能,上节中介绍了webrtc中是如何使用这些创建一个connection然后放入到一个列表中,那么webrtc 是如何选择最佳的组合进行连接的?webrtc中是如果对多个可能的连接进行排序?.........
2022-06-22 15:19:32
373
原创 WebRTC系列-网络传输之IceConfig及stunPing失败处理
iceConfig中定义很多的属性,这里列出几个比较关键的分析下,其他的都可以使用默认即可:其中是一个枚举值,定义是:network_preference网络适配的偏好这只这是一个枚举:其他属性的作用和默认值在上述源码里有说明;iceConfig参数初始化配置是在的中:这个函数主要的作用就是在IceConfig构造的同时,将RTCConfiguration的参数部分转换成IceConfig;然后通过的设置到ice相关模块;对于网络失败的重新检测可能需要间隔一段时间后重复检测,这个逻辑在webrtc
2022-06-21 20:30:00
579
原创 WebRTC系列-网络传输之3网络连接的建立过程
在WebRTC中是通过`connection`这个类来表示一个网络链接,对于每一个connection来说,都由本地的`Port`(*本地遍历后的网络的三要素:IP、 端口 、传输协议*)和远端的`Candidate`(*消息接收到的对端的网络的三要素:IP 、端口、 传输协议*)组成,webrtc通过这两个就可以建立一个链接;........................
2022-06-18 17:40:32
790
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅