自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 四、Mediasoup Js和 C++ 管道通信的过程

整体分为两部分1、 js对c++读写消息,_consumerSocket和producerSocket2、c++对js读写消息,c++收到都是底层都是通过libuv的uv_read_start和uv_write。

2023-09-11 21:37:19 404

原创 三、Mediasoup进程通信实现的原理

Mediasoup 创建父子进程,js与c++进程交互的通道worker.js构造函数中创建父子进程,c++通过libuv的socket可以实现 JavaScript 与 C++ 之间的相互收发消息。

2023-09-11 21:25:35 471

原创 二、Mediasoup启动过程

使用 child_process.spawn() 方法创建了一个子进程,并将它赋值给 this.#child。env:指定子进程的环境变量。这里设置了 MEDIASOUP_VERSION 变量,并将父进程的环境变量继承给子进程。stdio:指定子进程的标准输入、输出和错误流的处理方式。这里使用管道 (pipe) 来处理子进程的输出和错误。spawnBin:要执行的命令或可执行文件的路径。options:一个对象,用于配置子进程的选项。spawnArgs:传递给命令的参数数组。

2023-09-11 21:19:14 256

原创 一、Mediasoup源码介绍

RtpStreamSend对象,消费者发送数据给客户端,通过RtpStreamSend方法。RtpStreamSend继承自RtpStream,这个类处理Rtp数据流的收发。RtpStream使用到了RtpPacket,这个包是用于对Rtp数据包的分析,Rtp数据有数据包头,对于包头每一个字段的定义都是在这个Packet里面操作的因为要对整个数据进行处理,所以使用SeqManager,序列管理器。

2023-09-11 21:01:31 303

原创 Kotlin中特性、数据类、伴生对象、顶层函数

这是因为 Java 采用的是按值传递的方式,传递的是参数值的拷贝,而不是参数本身。因此,在 Java 中,可以在方法内部修改参数的值,这种修改对方法外部是可见的。顶层函数和属性:在 Kotlin 中,可以在文件的顶层定义函数和属性,它们在整个文件中都没有使用限制。这些替代方式提供了灵活性和可扩展性,同时避免了传统静态成员带来的使用伴生对象和顶层函数/属性来实现静态成员的优点。通过深入理解 Kotlin 的这些特性,开发人员可以编写更安全、更灵活和更易于维护的代码,提高开发效率和代码质量。

2023-09-09 17:19:09 468

原创 Android Studio 一键生成 JNI 头文件

现在,您可以在 Android Studio 中使用这个工具了。选中要生成 JNI 头文件的 Java 类,然后右键点击,选择 "External Tools"(外部工具),然后选择您配置的工具名称,即可生成对应的 JNI 头文件。JAVAH

2023-08-21 14:33:52 612

原创 SDP中的RTP头扩展

http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01(Extension ID 3):该头扩展用于传输广域拥塞控制信息,以帮助网络中的设备进行拥塞控制。http://www.webrtc.org/experiments/rtp-hdrext/video-content-type(Extension ID 6):该头扩展用于指示视频内容的类型,例如是摄像头捕获的实时视频还是事先录制的视频。

2023-08-17 11:38:34 327

原创 SDP 与Rtcp-fb

SDP(Session Description Protocol)是一种用于描述多媒体会话的协议,它在会话层起着重要的作用。SDP的主要功能是提供会话的元数据和配置信息,以便参与者能够协商和建立一致的会话。以下是SDP在会话层的作用:会话描述:SDP提供关于会话的描述,包括会话的起始时间、结束时间、会话名称、会话发起者等。这些信息帮助参与者了解会话的基本属性。媒体描述:SDP包含了关于会话中每个媒体流的描述,例如音频、视频、数据等。媒体描述包括媒体类型、传输协议、编解码器信息、网络地址等。

2023-08-17 11:24:58 627

原创 TCP 三次握手,四次挥手

因为收到客户端FIN,服务器先回应ack,然后数据清理完后就回应FIN=1,客户端再进行确认。ackRow都是对应请求seqraw,三次握手后,Seq就是服务器前一个包中的ack。第二次握手 SYN等于1 ACK等于1,Seq=Y,Ack=X+1。第三次SYN等于0 ACK等于1,Seq=X+1,Ack=Y+1。第一次握手 SYN 等于1,Seq=X。四次挥手,对方都需要发一次FIN包为1。三次握手对方都需要发一次SYN包为1。

2023-08-07 17:04:12 781

原创 Quic协议 0-RTT Http3

Tcp一个滑动窗口,Quic一路流一个窗口,单个窗口扔存在对头阻塞,其他流窗口不影响3.6Quic协议对服务器cpu消耗会比https增加两三倍tcp网络拥塞是在系统层面,quic是4层之上可以自定义拥塞算法QUIC 协议非常复杂,因为它做了太多事情:为了实现传输的可靠性,它基本上实现并且改进了整个 TCP 协议的功能,包括序列号,重传,拥塞控制,流量控制等。为了实现传输的安全性,它又彻底重构了 TLS 协议,包括证书压缩,握手消息,0RTT 等。

2023-08-03 15:52:57 391

原创 mars源码Tcp分析链接

【代码】mars源码Tcp分析链接。

2023-02-21 17:00:12 288

原创 Protobu编译本地环境搭建

C++,Protobu, PB windows

2023-01-11 21:04:28 153

原创 linux安装python升级python

linux安装python或者python升级流程linux自带的python是3.6版本的编译webrtc报错PythonL: invalid syntax file "", line 1要升级为python3.9。

2022-12-26 16:00:25 1525

原创 专业课测试题

关于表格内文字对齐方式的描述,下列哪种说法正确( )。题目类型:单选题正确答案:每个单元格都可以设置不同的对齐方式所属章节:基本的排版技巧-测试题如果要查看或删除分节符,最好的方法是在( )视图中进行。题目类型:单选题正确答案:页面所属章节:基本的排版技巧-测试题下列关于删除样式的说法,哪一种是错误的( )。题目类型:单选题正确答案:可以在“开始”功能区的样式列表中删除样式。所属章节:基本的排版技巧-测试题在应用字体之前,一般应先选择文本,如果不选择文本,那么设置.

2021-10-15 16:20:24 1692

原创 七.二 VideoChannel与VideoReceiveStream 关联

前言视频接收端流程比较复杂分六章进行介绍第一是 RTPTransport创建第二是 VideoChannel与VideoReceiveStream 关联第三是 视频接收端组包流程 发现有效的帧。第四是 jitterbuffer 与 PacketBuffer,RtpFrameReferenceFinder,FrameBuffe第五是 视频接收端解码分析第六是 视频接受端渲染分析前言1Channel 的产生是根据 SDP 的内容进行创建的,SDP 中的 audio 对..

2021-09-28 18:09:52 553

原创 七.一 RTPTransport创建

前言视频接收端流程比较复杂分六章进行介绍第一是 RTPTransport创建第二是 VideoChanne与VideoReceiveStream 关联第三是 视频接收端组包流程 发现有效的帧。第四是 jitterbuffer 与 PacketBuffer,RtpFrameReferenceFinder,FrameBuffe第五是 视频接收端解码分析第六是 视频接受端渲染分析目录一 基本概念Channel,Stream,Track二 AddTransceiver...

2021-09-28 17:49:44 524

原创 六 SDP解析

目录一SDP协议介绍二SDP解析一SDP协议介绍SDP全称是Session Description Protocol,翻译过来就是描述会话的协议。主要用于两个会话实体之间的媒体协商SDP描述由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。 具体内容请百度二SDP解析1调用 createOffer 在setLocalDescription后2 Pe

2021-09-28 16:28:15 367

原创 八 WebRTC 关键帧请求PLI与FIR

目录一 关键帧请求场景二 PLI与FIR前言: IDR Request关键帧也叫做即时刷新帧,简称IDR帧。对视频来说,IDR帧的解码无需参考之前的帧,因此在丢包严重时可以通过发送关键帧请求进行画面的恢复。关键帧的请求方式分为三种:RTCP FIR反馈(Full intra frame request)、RTCP PLI 反馈(Picture Loss Indictor)或SIP Info消息,具体使用哪种可通过协商确定.一 关键帧请求场景1.1 H264解码无sps,pps信息.

2021-09-22 12:13:27 2304

原创 五 Webrtc端对端基本流程

目录​​​​​​一基本流程二 创建媒体约束 RTCConfig三初始化rtc的能力四bindTrack五Ice概念一基本流程1.1在join加入会议后createPeerconnection ,biandTrack1.2createOffer 在setLocalDescription开发收集ice1.3setRemoteDescription 算是协商完成当媒体协商完成后,webrtc开始建立网络连接,这个过程称为ICE1.4添加addRemoteI.

2021-09-22 11:43:01 507

原创 四 Android Studio 单步调试 WebRTC Android

目录一编译 Debug 包二 工程配置三 LLDB断点调试配置一编译 Debug 包前言:之前开发过程中,WebRTC 在 Android 上的断点调试比较麻烦,一直困扰没有解决,后与IOS开发同学交流发现xcode是可以的,变通过LLDB验证最后是可行的打断点自然需要使用到包含调试信息,编译rtc库避免编译时这些信息被 strip 掉,因此需要修改webrtcsrc目录下 build/toolchain/android/BUILD.gn文件二 工程配置...

2021-08-31 11:19:41 1154 1

原创 三 RTC libwebrtc.jar抽取

1 抽取libwebrtc.jar的源码 在RTC各个模块下Android代码webrtc/sdk/android/api/org/webrtc webrtc/sdk/android/src/java/org/webrtc webrtc/base/java/src/org/webrtc webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine webrtc/examples/androidapp 2 ...

2021-08-10 16:33:21 370

原创 二 Ubuntu下编译WebRtc-Android

目录一 docker方式二Ubuntu虚拟机方式三 拉取webrtc代码四 编译1、设置编译参数,生成ninja文件2 编译生成.a文件和.so 文件3 编译生成aar五编译错误锦集1 find local lib sudo strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX2 erro No module named 'dataclasses'编译WebRtc代码 谷歌建议在L...

2021-08-10 15:45:29 779

原创 一 Mac安装Ubuntu

1 Mac 下Vmware中Ubuntu的安装Vmware中Ubuntu的安装 具体按照步骤请参照:https://www.jianshu.com/p/489ea047caa82 Ubuntu中Vmware 文件共享Vmware Tools是VMware提供的一套非常人性化的程序,可以用来解决虚拟机的分辨率问题,鼠标的性能,以及Ubuntu和宿主机文件的交换问题。必须在虚拟机已经开启且已安装操作系统的前提下才能安装VmMware Tools。它是通过光盘镜像的方式加载到相对应操作系统下来..

2021-08-10 15:10:39 3386

原创 第八章 文件操作

一 常用操作1写入单个字符FILE *f = fopen("xxxx\\t.txt","w");//写入单个字符fputc('a', f);fclose(f);2写入以 null 结尾的字符数组FILE *f = fopen("xxxx\\t.txt","w");char *txt = "123456";//写入以 null 结尾的字符数组fputs(txt, f);//格式化并输出fprintf(f,"%s",txt);fclose(f);3 f

2021-08-10 11:41:44 87

原创 第七章 数据结构与类型转化

前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程一、 Namespace 1、NamespaceNamespace 命名空间 避免库相互污染,使用两种方式1用using 引用声明的空间2声明的空间:: 引用类生成对象namespace A{class Car { friend void test(Car* c); friend void test1(Car* );// virtual void test(); ...

2021-08-10 11:12:46 100

原创 第六章 类的析构函数与 RVO

前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程目录一、析构函数二、RVO、NRVO一、析构函数类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。如果在构造函数new一些对象,就需要在析构函数进行释放掉下面的实例有助于更好地理解析构函数的概念:#incl...

2021-08-09 20:44:44 118

原创 第五章 C++继承,多态,虚函数

前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程目录一、继承二、多态三、纯虚函数四、总结一、继承1、继承 class A: B默认为private 私有继承 ,不能调用父类的public方法B是基类,A称为子类或者派生类2、多继承 一个子类可以有多个父类,它继承了多个父类的特性。 class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,...

2021-08-09 19:49:33 83

原创 第四章 C++中的作用:: 与Namespace

第四章 C++中的作用:: 与Namespace前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程目录第二章 C 指针 数组与malloc一、指针二、数组三、malloc与calloc一、 Namespace 1、NamespaceNamespace 命名空间 避免库相互污染,使用两种方式1用using 引用声明的空间2声明的空间:: 引用类生成对象namespace A{class Car { friend void...

2021-07-02 20:27:53 165 2

原创 第二章 C 指针 数组与malloc

第一章 C 数据类型与预处理器前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程目录C++学习一、 数据类型二、预处理器1.常用预处理器2.宏3.预处理器是一个文本替换工具三、关键字一、 数据类型 1.**signed**----有符号,可修饰char、int。Int是默认有符号的。 2.**unsigned**-----无符号,修饰int 、char| 整型 | 字节 | 取值范围 ...

2021-07-02 18:25:04 634

原创 第三章 extern “C“ 与std, 字符串操作

第二章 C 指针 数组与malloc前言C++ 学习路线,本人主要也是为了记录一下自己的学习过程目录第二章 C 指针 数组与malloc一、指针二、数组三、malloc与calloc一、 指针 1、指针> 指针是一个变量,其值为地址。> 声明指针或者不再使用后都要将其置为0 (NULL)> 野指针 未初始化的指针> 悬空指针 指针最初指向的内存已经被释放了的一种指针 //指针是一个变量,...

2021-07-02 18:20:48 705

原创 第一章 C 数据类型与预处理器

C++学习第一章 C 数据类型与预处理器前言提示:学习C开发提示:以下是本篇文章正文内容,下面案例可供参考目录C++学习一、 数据类型二、预处理器1.常用预处理器2.宏3.预处理器是一个文本替换工具三、关键字一、 数据类型 1.**signed**----有符号,可修饰char、int。Int是默认有符号的。 2.**unsigned**-----无符号,修饰int 、char| 整型 | 字节 | 取值范围...

2021-07-02 15:54:26 65

原创 音视频传输协议RTP:RTMP:  RTCP:SDP:

音视频传输协议RTP: RTP全称是Real- time Transport Protocol(实时传输协议),是在Internet上处理多媒体数据流的传输层协议,利用它能够在一对一(unicast,单播)或者一对多 (multicast,多播)的网络环境中实现传流媒体数据的实时传输。 RTP通常使用UDP协议来实现多媒体的传输;RTMP:Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服...

2020-05-20 10:58:58 880 1

原创 在Android Studio中使用 maven

1在Android Studio中使用 maven,发布到本地仓库apply plugin: 'maven' // 由于Android Studio 自带有 maven 插件,所以我们并不需要再额外安装配置mavendef MAVEN_REPOSITORY_PATH = 'file:///Users/xxx/code/maven-repo'def GROUP_ID = 'co...

2019-08-24 16:42:53 4267 2

原创 内网离线安装android studio并且构建android 项目

内网离线安装android studio并且构建android 项目根据https://www.cnblogs.com/yxliu/p/10004765.html,自己总结了一下1 用一台在线电脑 需要准备一下资源caches:为安装过程和新建项目过程中,下载的缓存文件android-studio-ide.zip:为android studio安装包,解压即可gradl...

2019-08-22 16:03:25 1624 1

原创 安卓新架构Room与Lifecycles,LiveData

Room Lifecycles   生命周期管理(Lifecycles)获取ui的生命周期状态 ViewModel 将视图的数据和逻辑从具有生命周期特性的实体(如 Activity 和 Fragment)中剥离开来。直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中Vi...

2019-02-20 10:10:31 210 1

原创 Kotlin入门

Kotlin作用域函数let、apply、run、lazy。集合IntArray mutableSetOf ,操作函数 filter、reduce

2019-02-20 10:09:16 438 1

原创 android客户端中Sql的递归查询

公司业务需要查询通讯录部门数据 就想到了递归查询了一下 sql也可以直接递归查询第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点第二个查询被称为递归成员,使该查询成为递归成员的是对递归引用时触发(递归表.id与该表的pid递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果with as在mysql不支持,在with as在...

2019-02-20 10:07:03 230 1

原创 Rxjava 强大之处

Rxjava有三个原因:第一个是代码的简洁度,链式。第二个是响应式框架,观察者模式。第三个就是它是一个异步的框架,线程切换功能极其强大,可任意指定观察者发生的线程以及被观察者的线程,随意调整极其强大(观察者发生的线程只能更改一次,被观察的可以随意切换Observable和Subscriber大家已经很熟悉了,分别是被观察者和观察者在使用RxJava过程中我们一般都是三步第一...

2019-02-20 10:05:23 294 1

原创 IM为什么需要心跳

客户端需要心跳的原因对于客户端而言,使用 TCP 长连接来实现业务的最大驱动力在于:在当前连接可用的情况下,每一次请求都只是简单的数据发送和接受,免去了 DNS 解析,连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息。但前提是连接可用。NAT大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断(NAT超...

2019-02-20 10:02:20 540 1

原创 对fragment和ayer-list 的一起使用z

对fragment和ayer-list 的一起使用z

2016-08-26 14:07:38 452

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除