webrtc源码分析
文章平均质量分 86
分析webrtc源码
mo4776
这个作者很懒,什么都没留下…
展开
-
webrtc中的Track,MediaChannel,MediaStream
Audio/Video track,MediaChannel,MediaStream是Webrtc的业务核心,对媒体的操作都是围绕着这三个对象进行,弄清出它们见的关系及作用,就等于弄清了Webrtc的骨架,对阅读Webrtc的代码大有益处。根据本地sdp或sdp的协商结果,来产生MediaChannel,MediaChannel代表一个Video或Audio通道,里面会有多个不同方向的MediaStream。sdp中的媒体信息需要转化为具体的编解码器,rtp流的信息。这些信息最终会分别变成为。原创 2024-04-14 21:30:06 · 1130 阅读 · 0 评论 -
webrtc native api的几个要点
sdp中核心的信息就是描述媒体信息的内容,简称m行或媒体行。通过pc对象的AddTrack或AddTransceiver方法添加track,会直接反映到sdp中。一个PC对象表示一次P2P会话,它包括sdp handle,call。如下代码,添加了两个VideoTrack,最终反映到sdp中为两个sendrecv的m行。整个过程本质就是获取本地sdp信息和远端sdp信息,再进行协商,流程可以概括为如下图。,前者是告知sdp创建,协商的状态。,是webrtc native的pc对象封装示例代码。原创 2024-02-06 20:15:49 · 1507 阅读 · 0 评论 -
webrtc中的接口代理框架
模块提供接口,外部代码通过接口来使用模块功能。业务应用通过一层proxy来使用webrtc通过功能,也就是应用层与webrtc通过proxy隔离。在webrtc中通过一种接口代理的方式,来封装了对外的接口。(类图中我列出了类所在的文件名,方便查看代码,它的接口太多,这里就不列出了)(类图中我列出了类所在的文件名,方便查看代码,列出了几个核心的接口)文件中,这里就不展开叙述了,可以直接看看代码,是怎么使用的。在webrtc中需要导出的接口,采用的是如上的类体系。方法,它将产生接口类的实例类,供应用使用。原创 2024-01-01 12:03:06 · 1191 阅读 · 0 评论 -
webrtc中的线程(二)ProcesThread
所以它也是一个异步任务队列。它也是一个接口,具体实现类为。在Pacing,audio 模块都有用到,主要用法就是注册。不同,它并没有直接封住操作系统的线程类API,而是使用了。主要功能方法,就是往Module list中插入或删除。实现还是比较简单,就是依次执行几个任务队列中的任务。在webrtc中另外一个用的比较多的线程对象是。就是驱动队列的事件:当队列为空时,线程阻塞在。因为它是一个异步任务队列,它内部的队列就是。,它主要用于执行定时任务。是定时任务队列,执行定时任务队列是。原创 2023-03-13 08:02:21 · 283 阅读 · 0 评论 -
webrtc中的线程(一) rtc::Thread
是webrtc中最重要的线程类型。它与WebRtc库的实现深度结合。线程类型,主要是用作执行一些定时任务。这篇文章将介绍rtc::Thread及它在WebRtc中的使用。的线程模型如下:不仅仅是只产生一个线程,它还包含一个队列**(message list)**,将它称为异步任务队列更适合。它的基本功能就是在线程中执行任务队列中的任务。它靠事件驱动,也就是说当中没有任务()时,它会阻塞在事件等待上,当有事件唤醒时后会继续在队列中去任务执行。在图中可以看到它可以处理IO事件,这里的IO事件就是网络数据的收发原创 2023-03-04 08:26:32 · 967 阅读 · 0 评论 -
webrtc中视频采集实现分析(二) 视频帧的分发
视频采集模块,抛出视频数据后,对视频帧的处理需求一般包括如下几种:视频帧送到编码模块进行编码视频帧送到渲染模块进行本地回显视频帧先进行预处理(比如添加水印,字幕),再送去回显或编码视频帧会送到多个编码器,产生多路不同分辨率,码率的码流所以从采集模块获取的视频帧是需要分发的,也是只有一个source,但是有多个sinkwebrtc中的实现webrtc中有一个对视频帧的分发框架,可以直接借用相关实现videoSourceInterface作为source的基类主要接口是 AddOrU原创 2022-01-13 16:07:48 · 2387 阅读 · 0 评论 -
webtrc 中VideoAdapter类中的作用及局限
需求在媒体库中,是要求能动态改变编码的分辨率和帧率的,思路是重启编码器,设置编码器新的分辨率,帧率参数来满足要求。所以输入到编码器中的视频流分辨率,帧率应该与设置的分辨率参数是一致的。但是不能通过改变视频采集的分辨率来实现,否则可能会造成摄像头重启,导致图像会黑一下。往往是在送入编码器之前应该有专门进行分辨率,码率适配的功能类。输入的是视频采集的原始分辨率和帧率,输出的是满足于编码器的编码分辨率和帧率。VideoAdapter类分辨率的适配webrtc中VideoAdapter类就是实现这里的功能原创 2022-01-11 15:13:16 · 1143 阅读 · 0 评论 -
webrtc中的引用计框架
webrtc中的引用计框架文章目录webrtc中的引用计框架基本框架类scoped_refptr实现用法使用示例基本框架类webrtc中通过RefCounter,RefCountedObject,RefCountInterface类提供了一个引用计数框架。RefCounter是计数器类,实现了线程安全的计数功能;RefCountedObject对RefCounter进行了封装;RefCountInterface是接口类,要求实现AddRef()和Release()接口。它们可以单独使用,可以结合使用。原创 2022-01-10 19:15:03 · 599 阅读 · 0 评论 -
webrtc中视频采集实现分析(一) 采集及图像处理接口封装
文章目录webrtc中视频采集类DeviceInfoGetBestMatchedCapabilityVideoCaptureModuleVideoCaptureFactory示例视频帧处理I420Buffer视频采集是媒体库最基础功能。但是它的实现与操作系统有强相关性,因为不同的操作系统提供的视频采集接口不一样。视频采集模块也具有通用性,不同媒体库的视频采集模块实现的功能是相同的,主要包括如下几个功能:检索视频采集设备指定视频采集设备进行采集根据指定的采集参数(包括分辨率,帧率,图像格式)来初始化原创 2022-02-08 11:52:10 · 3561 阅读 · 1 评论 -
webrtc中的视频编码(一) 视频编码模块轮廓
关于webrtc视频编码的分析,这将是一系列文章,主要从代码结构和设计思路两个方面去分析视频编码模块,不会进入代码细节,目的是在自己实现视频编码时可以从中借鉴。这篇文章是这个系列的第一篇,主要是介绍视频编码模块轮廓。整个视频编码功能包括下面几个功能类:视频编码接口类,是一个抽象接口类。它有多个实例,编码h264 encoder,vp8/9 encoder工厂类,用于创建的具体实例 h264编码接口类,有个方法用于创建h264的编码类实例(好绕-_-!) h264编码的具体实现,的实例包括,, 它们之间的关系原创 2022-07-08 11:54:45 · 1935 阅读 · 0 评论 -
webrtc中的任务队列TaskQueue
webrtc中的任务队列TaskQueue代码分析原创 2022-07-04 17:46:14 · 737 阅读 · 0 评论 -
浅述webrtc中的ICE流程
背景webrtc的提供的音视频解决方面是针对P2P的,在实际的运用的中往往有诸多限制。在很多场景中会有一个webrtc接入服务来实现对web的接入,实现与具体的音视频业务的转换。web 互通的基本流程上图是web对通的基本流程,图中描述的是两个web进行点对点互通。涉及到角色有信令服务,STUN,TURN服务。STUN/TURN+NAT穿越流程即代表了ICE流程webrtc接入服务web与接入服务的互通,跟上图的流程差别不大。只是web与接入服务在ICE中所扮演的角色不同,本篇文章将介绍ICE的基原创 2021-04-26 10:42:26 · 3106 阅读 · 0 评论 -
走读webrtc 中的视频JitterBuffer(二)
VCMDecodingStateVCMDecodingState 是用于判断nalu是否可以连续解码,判断的依据因不同编码格式而不同。它支持了三种编码格式:VP8,VP9,H264,看下它定义的几个成员变量uint16_t sequence_num_;uint32_t time_stamp_;int picture_id_;int temporal_id_;int tl0_pic_id_;bool full_sync_; // Sync flag when temporal layers a原创 2020-10-09 11:17:28 · 437 阅读 · 0 评论 -
走读Webrtc 中的视频JitterBuffer(一)
基本概念在实时流媒体系统中,jitterbuffer是在解码端,起到如下几个作用:对rtp包进行排序对rtp包进行去重去抖动对于1,2点比较简单。核心的是去抖动,去抖动实现的目标就是使视频能平滑播放,不因为抖动忽快忽慢。简单的视频jitterbuffer可以只针对rtp包进行处理,只对rtp进行排序,去重。并不处理视频帧。如下图这种简单的实现并不关心视频帧是否有错,是否可以解码。视频帧间是否可以持续解码。(针对视频帧内的RTP包,如果经过排序和去重,可以认为是可解码的)。这些全部放在解码原创 2020-10-09 11:14:04 · 1207 阅读 · 0 评论