自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 WebRTC解析

首选场景:需要浏览器免插件、超低延迟、强加密的实时交互万级并发直播(需结合 CDN 架构)纯音频广播(HLS 更经济)快速开发:Agora/Sendbird自主可控:Mediasoup/Jitsi移动端:Pion/Flutter-WebRTC通过合理架构设计(如 SFU/MCU 模式选择),WebRTC 可支撑从 1v1 通话到万人直播的全场景需求,是下一代实时通信系统的基石技术。

2025-02-24 11:24:23 790

原创 RTSP协议

需求推荐协议专业级媒体控制浏览器兼容直播WebRTC 或 HTTP-FLV超低延迟(<500ms) WebRTC 或 SRT大规模直播分发传统设备兼容RTMP建议结合具体业务需求进行协议栈设计,现代系统常采用混合架构(如 RTMP 接入 + HLS 分发)。

2025-02-24 10:41:46 835

原创 rtmp协议

RTMP(Real-Time Messaging Protocol)是Adobe设计的基于TCP的实时流媒体传输协议,专为低延迟场景(如直播、视频通话)优化。消息结构由基本头(Basic Header)、消息头(Message Header)、扩展时间戳(Extended Timestamp,可选)和消息体(Message Payload)组成。默认端口1935,支持加密变种RTMPS(端口443)基于分块传输(Chunking)机制,支持消息拆解与重组。

2025-02-20 21:56:24 758

原创 rtp/rtcp协议

用途:专为实时音视频流传输设计(如VoIP、视频会议、流媒体),支持时间敏感型数据的传输。定位:运行在UDP之上(也可用TCP,但较少见),提供端到端的传输服务。核心能力:时间戳同步:解决多流同步问题(如音画对齐)。序列号跟踪:检测丢包、乱序,支持网络质量评估。负载格式无关性:负载类型标识(编码格式协商)支持任意编码格式(H.264、Opus等),通过Payload Type(PT)标识。扩展性:支持自定义头部扩展(RFC 8285)和CSRC混流标识。

2025-02-20 17:33:41 908 1

原创 Markdown语法

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + S

2025-02-20 15:41:41 846

原创 抓取iOS hci日志

将手机通过数据线连接mac,点击start开始录制,PacketLogger左上角会显示连接的iOS设备名称,手机左上角会显示蓝色的标志,这表示已经在开始录制hci日志。中下载Bluetooth for iOS的Profile,发送到iOS设备上,在设置中安装Profile。需要准备一台mac电脑,在Apple Devloper上注册账号,电脑上安装PacketLogger软件,手机上安装Bluetooth for iOS的Profile。如果没有以上状态,在PacketLogger新建一个连接。

2024-01-15 11:59:51 330

原创 iOS蓝牙扫描的坑

然后,App通常会在收到1-3个系统回调后变为正常,这个取决于SCAN_RSP的更新时间,所以具体什么时候数据能恢复正常是不确定的,1-3包只是经验值。所以,如果你的BLE设备的广播数据会发生变化,那么是需要考虑数据错乱问题的。可以对ADV_IND+SCAN_RSP增加校验,如果是错的数据就丢掉。由于苹果的这种特性,建议在前台时扫描蓝牙设备时,设置。App在收到广播包变化的第一个系统回调通常为。此时,BLE设备广播发生变化,广播数据变为。iOS此时向App广播的数据也是。在后台扫描蓝牙时,设置。

2023-06-14 10:34:48 1420

原创 MAC配置SSH

(注意,这里的 your_email@example.com 是你自己的邮箱(例如:11******@qq.com),选一般的常用的邮箱即可,不常用的邮箱一般不推荐)首次使用sourcetree获取该域名服务器下的项目时,无法把该域名下的的信息(域名,host,公钥)写入本地的konwn_hosts(目录:~/.ssh/)文件中的。复制文件内容,粘贴到github等网站的SSH key里,标题可以随便起,大功告成!默认会在相应路径下(~/.ssh)生成id_rsa和id_rsa.pub两个文件,

2023-02-06 18:12:16 11823 1

原创 08、Flutter开发创建项目及其案例(三)

一、自定义Widget此次例子中,项目就是一个大的widget标题的Widget:使用一个Text Widget完成;描述的Widget:使用一个Text Widget完成;图片的Widget:使用一个Image Widget完成;上面三个Widget要垂直排列,我们可以使用一个Column的Widget另外,三个展示的标题、描述、图片都是不一样的,所以我们可以让Parent Widget来决定内容:创建三个成员变量保存父Widget传入的数据class ProductItem exte

2021-05-24 19:19:10 311

原创 07、Flutter开发创建项目及其案例(二)

2.3、代码改进2.3.1、改进样式我们可能希望文字居中显示,并且可以大一些;居中显示: 需要使用另外一个Widget,Center;文字大一些: 需要给Text文本设置一些样式;我们修改代码如下:我们在Text小部件外层包装了一个Center部件,让Text作为其child;并且,我们给Text组件设置了一个属性:style,对应的值是TextStyle类型;import 'package:flutter/material.dart';main(List<String> a

2021-05-10 15:20:21 339 1

原创 06、Flutter开发创建项目及其案例(一)

一. 创建Flutter项目创建Flutter项目有两种方式:通过命令行创建 和 通过开发工具创建1.1. 通过命令行创建通过命令行创建非常简单,在终端输入以下命令即可:**注意:**Flutter的名称不要包含特殊的字符,另外不可以使用驼峰标识创建完之后使用自己喜欢的开发工具打开即可flutter create learn_flutter1.2. 通过开发工具创建我这里也可以直接通过Android Studio1.3. 默认程序分析我们讲创建的应用起来跑在模拟器上(我这里选择iPh

2021-05-09 18:59:36 474 1

原创 Carthage安装使用

Carthage介绍Carthage是GitHub上开源的、用于Cocoa开发的三方依赖管理工具。GitHub地址:https://github.com/Carthage/Carthage通过Carthage,我们在iOS项目的开发中可以很方便的对三方依赖进行配置管理。Carthage的原理,简而言之,是通过配置文件Cartfile指定所依赖的三方框架,Carthage通过分析配置文件的内容,通过从github、git仓库或二进制包URL获取依赖,生成为同时包含模拟器和真机目标代码的.framewor

2021-05-07 20:44:45 852

原创 05、Flutter开发Dart的异步(二)

三. Dart的异步补充3.1. 任务执行顺序3.1.1. 认识微任务队列在前面学习学习中,我们知道Dart中有一个事件循环(Event Loop)来执行我们的代码,里面存在一个事件队列(Event Queue),事件循环不断从事件队列中取出事件执行。但是如果我们严格来划分的话,在Dart中还存在另一个队列:微任务队列(Microtask Queue)。微任务队列的优先级要高于事件队列;也就是说事件循环都是优先执行微任务队列中的任务,再执行 事件队列 中的任务;那么在Flutter开发中,哪

2021-05-04 19:04:03 203

原创 04、Flutter开发Dart的异步(一)

一. Dart的异步模型1.1. Dart是单线程的1.1.1. 程序中的耗时操作开发中的耗时操作:在开发中,我们经常会遇到一些耗时的操作需要完成,比如网络请求、文件读取等等;如果我们的主线程一直在等待这些耗时的操作完成,那么就会进行阻塞,无法响应其它事件。如何处理耗时的操作呢?针对如何处理耗时的操作,不同的语言有不同的处理方式。处理方式一:多线程,比如Java、OC、Swift、C++,我们普遍的做法是开启一个新的线程(Thread),在新的线程中完成这些异步的操作,再通过线程间通信的

2021-05-04 18:47:11 318

原创 03、Flutter开发Dart-函数

1. 函数1.1. 函数的基本定义Dart是一种真正的面向对象语言,所以即使函数也是对象,所有也有类型, 类型就是Function。这也就意味着函数可以作为变量定义或者作为其他函数的参数或者返回值.函数的定义方式:返回值 函数的名称(参数列表) { 函数体 return 返回值}按照上面的定义方式, 我们定义一个完整的函数:int sum(num num1, num num2) { return num1 + num2;}Effective Dart建议对公共的API,

2021-05-04 16:29:48 474

原创 02、Flutter开发Dart-数据类型

一、 数据类型1.1. 数字类型对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int,浮点数用double就行了。不过,要说明一下的是Dart中的int和double可表示的范围并不是固定的,它取决于运行Dart的平台。// 1.整数类型intint age = 18;int hexAge = 0x12;print(age);print(hexAge);// 2.浮点类型doubledouble height = 1.88;print(heig

2021-05-04 16:27:50 300

原创 01、Flutter开发Dart安装与定义变量

一、安装Dart为什么还需要安装Dart呢?在安装Flutter SDK的时候,它已经内置了Dart了,我们完全可以直接使用Flutter去进行Dart的编写并且运行。但是,如果你想单独学习Dart,并且运行自己的Dart代码,最好去安装一个Dart SDK。1.2、下载Dart SDK到Dart的官方,根据不同的操作系统下载对应的Dart官方网站无论是什么操作系统,安装方式都是有两种:通过工具安装和直接下载SDK,配置环境变量1.通过工具安装Windows可以通过Chocolateym

2021-05-04 16:10:25 392

原创 音视频01-mac环境搭建

1 FFmpeg1.1 FFepeg安装在Mac环境中,直接使用Homebrew安装FFmpeg即可。终端执行:brew install ffmpeg安装完毕后,如果能成功在命令行查看FFmpeg的版本号,那说明已经安装成功。ffmpeg -version1.2 目录结构通过brew install安装的软件会存放到/usr/local/Cellar目录中,通过以下命令可以打开FFmpeg的安装目录。cd /usr/local/Cellar/ffmpegopen .bin

2021-03-29 13:57:57 169

原创 githubhosts配置

好用的工具:SwitchHosts添加链接描述如何操作操作系统的 hosts 文件Windows 下在: C:/Windows/system32/drivers/etc/hosts苹果 Mac OSX 和 Ubuntu 等linux系一般在:/etc/hostsmac可command+shift+G前往/private文件夹,hosts文件在etc文件夹下,可以直接访问配置文件。hosts 文件内关于 github IP 地址的内容199.232.69.194 github.global.

2021-03-28 15:36:46 2425 1

原创 flutter开发mac环境搭建

一、flutter SDK下载1、官网下载地址:https://flutter.dev/docs/development/tools/sdk/releases?tab=macos选择下载和自己操作系统的版本且稳定的Stable版本。2、下载之后解压,选择保存路径,建议保存到系统根目录,或者资源库,不建议保存到下载、桌面等地方,避免误操作。flutter环境变量配置1、因为需要在终端执行flutter命令,所以需要flutter环境变量,mac配置环境变量需要编辑~/.bash_profile文件。

2021-01-04 11:12:35 524

原创 新mac安装CocoaPods完整流程

背景新入职公司,分配一台全新MacBook pro,借此机会梳理一下cocoapods的完整安装流程。cocoapods安装依赖关系cocoapods安装需要ruby,更新ruby需要rvm,下载rvm需要gpg,下载gpg需要homebrew,所以安装顺序是homebrew->gpg->rvm->ruby-cocoapods,注意这是完整流程,如果只是更新做cocoapods更新操作即可,不需要从第一步开始。一、安装homebrew终端命令:/bin/bash -c "$(c

2020-12-12 17:45:49 3634 5

原创 flutter开发-MAC终端配置的环境变量失效问题

实践问题:mac在配置好环境变量之后,同步检测成功,查看版本一切正常,重启终端或者vscode之后,编译代码出现bin/sh: dart: command not found问题。问题原因:mac装了zsh,zsh加载的是~/.zshrc 文件,而没有加载 ~/.bash_profile文件。解决方法:1、终端 cd到~/.zshrc文件位置(该文件路径一般为/Users/用户名/.zshrc),执行指令:open -e .zshrc2、在最后一行加上source ~/.bash_profile*

2020-10-27 18:02:25 928 1

原创 IOS-swift状态栏设置Status bar style

更改状态系统颜色setNeedsStatusBarAppearanceUpdate()override var preferredStatusBarStyle: UIStatusBarStyle { let _ = super.preferredStatusBarStyle return UIStatusBarStyle.lightContent}preferredStatusBarStyle不调用的问题1、删除info.plist 这个键值对 <key>UI

2020-09-14 21:59:13 1002

原创 IOS开发Swift笔记26-响应式编程

响应式编程(Reactive Programming,简称RP)也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定一般与函数式融合在一起,所以也会叫做:函数响应式编程(Functional Reactive Programming,简称FRP)——————————————————————————————比较著名的、成熟的响应式框架ReactiveCocoa简称RAC,有Objective-C、Swift版本官网: http://reactivecocoa.io/git

2020-09-09 17:38:44 295

原创 IOS开发Swift笔记25-面向协议编程

面向协议编程面向协议编程(Protocol Oriented Programming,简称POP)是Swift的一种编程范式, Apple于2015年WWDC提出在Swift的标准库中,能见到大量POP的影子同时,Swift也是一门面向对象的编程语言(Object Oriented Programming,简称OOP)在Swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方POP能弥补OOP一些设计上的不足————————————————————————————回顾OOPO

2020-09-09 00:43:59 288

原创 IOS开发Swift笔记24-函数式编程

Array的常见操作var arr = [1, 2, 3, 4] // 重组var arr2 = arr.map { $0*2} // [2, 4, 6, 8]// 过滤var arr3 = arr.filter { $0%2 == 0} // [2, 4]// 元素演绎var arr4 = arr.reduce(0) { $0+$1} // 10var arr5 = arr.reduce(0, +) // 10print(arr5)func double(_ i: Int) -&

2020-09-09 00:21:35 131

原创 IOS开发Swift笔记23-模式匹配

模式什么是模式?模式是用于匹配的规则,比如switch的case,捕捉错误的catch、if、g’uard、while、for语句的条件————————————————————————————Swift中的模式有通配符模式(Wildcard Pattern)标识符模式(Identifier Pattern)值绑定模式(Value-Binding Pattern)元组模式(Tuple Pattern)枚举Case模式(Enumeration Case Pattern)可选模式(Optio

2020-09-08 19:32:39 239

原创 IOS开发Swift笔记22-字面量

var age = 10var isRed = falsevar name = "Jack"上面代码:10, false,“Jack”都是字面量————————————————————————————常见字面量的默认类型public typealias IntegerLiteralType = Intpublic typealias FloatLiteralType = Doublepublic typealias BooleanLiteralType = Boolpublic type

2020-09-08 16:16:30 104

原创 IOS开发Swift笔记21-内存管理、指针

内存管理跟OC一样,Swift也是采取基于引用计数的ARC内存管理(针对堆空间)Swift的ARC中有3种引用强引用(strong reference):默认情况下,引用都是强引用弱引用(weak reference):通过weak定义弱引用-必须是可选类型的var,因为实例销毁后,ARC会自动将弱引用设置为nil-ARC自动给弱引用设置nil时,不会触发属性观察器无主引用(unowned reference):通过unowned定义无主引用-不会产生强引用,实例销毁后仍然存储着实例的内存

2020-09-08 01:52:14 168

原创 IOS开发Swift笔记20-访问控制

访问控制在访问权限控制这块,Swift提供了5个不同的访问级别(以下是从高到低排列, 实体指被访问级别修饰的内容)open:允许在定义实体的模块、其他模块中访问,允许其他模块进行继承、重写(open只能用在类、类成员上)public:允许在定义实体的模块、其他模块中访问,不允许其他模块进行继承、重写internal:只允许在定义实体的模块中访问,不允许在其他模块中访问fileprivate:只允许在定义实体的源文件中访问private:只允许在定义实体的封闭声明中访问绝大部分实体默认都是

2020-09-07 18:53:50 181

原创 IOS开发Swift笔记19-扩展(Extension)

扩展(Extension)Swift中的扩展,有点类似于OC中的分类(Category)扩展可以为枚举、结构体、类、协议添加新功能可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等扩展不能办到的事情不能覆盖原有的功能不能添加存储属性,不能向已有的属性添加属性观察器不能添加父类不能添加指定初始化器,不能添加反初始化器…计算属性、下标、方法、嵌套类型extension Double { var km: Double { self * 1_000.0 }

2020-09-07 18:11:59 516 1

原创 IOS开发Swift笔记18-高级运算符

关于String的思考1个String变量占用多少内存?下面2个String变量,底层存储有什么不同?var str1 = "0123456789"var str2 = "0123456789ABCDEF"

2020-09-07 17:51:23 129

原创 IOS开发Swift笔记17-泛型

泛型泛型可以将类型参数化,提高代码复用率,减少代码量泛型函数赋值给变量————————————————————————————————————func swapValue<T>(_ a: inout T, _ b: inout T){ (a, b) = (b, a)}var i1 = 10var i2 = 20swap(&i1, &i2)var d1 = 10.0var d2 = 20.0swap(&d1, &d2)struct

2020-09-06 02:40:26 170

原创 IOS开发Swift笔记16-错误处理

错误类型开发过程中常见的错误类型语法错误(编译报错)逻辑错误运行时错误(可能导致闪崩,一般也叫异常)…——————————————————自定义错误Swift中可以通过Error协议自定义运行时的错误信息函数内部通过throw抛出自定义Error,可能会抛出Error的函数必须加上throwsenum SomeError: Error { case illegalArg(String) case outOfBounds(Int, Int) case outOf

2020-09-05 23:25:28 201

原创 IOS开发Swift笔记15-协议

协议协议可以定义方法、属性、下标的声明。协议可以被枚举、结构体、类遵守(多个协议用逗号分开)protocol Drawable { func draw() var x: Int {get set} var y: Int {get} subscript(index: Int) -> Int {get set}}protocol Test1 {}protocol Test2 {}protocol Test3 {}class TestClass: Test1,

2020-09-05 02:12:22 163

原创 IOS开发Swift14-可选链

可选链class Car { var price = 0 }class Dog { var weight = 0 }class Person { var name: String = "" var dog: Dog = Dog() var car: Car? = Car() func age() -> Int { 18 } func eat() { print("Person eat") } subscript(index: Int) ->

2020-09-04 18:51:30 144

原创 IOS开发Swif笔记13-初始化

初始化器类、结构体、枚举都可以定义初始化器类有2种初始化器:指定初始化器、便捷初始化器 // 指定初始化器 init (prameters){ statements} // 便捷初始化器convenience init(prameters){ statements}每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器。默认初始化器总是类的指定初始化器。类偏向于少量指定初始化器,一个类通常只有一个指定初始化器。初始化器的相互调用规则指定初始化器必须

2020-09-04 18:31:53 193

原创 IOS开发Swift笔记12-继承

继承值类型(枚举、结构体)不支持继承,只有类支持继承没有父类的类,称为:基类Swift并没有想OC,Java那样的规定:任何类最终都要继承自某个基类子类可以重写父类的下标、方法、属性,重写必须加上override关键字class Animal { var age = 0}class Dog: Animal { var weight = 0}class ErHa: Dog { var iq = 0}let a = Animal()a.age = 10p

2020-09-03 22:03:21 237

原创 IOS开发Swift笔记11-方法和下标

方法枚举、结构体、类都可以定义实力方法、类型方法。实例方法:通过实力对象调整。类型方法:通过类对象调用,用static或者class关键字定义class Car { static var cout = 0 init() { Car.cout += 1 } static func getCount() -> Int { cout }}let c0 = Car()let c1 = Car()let c2 = Car(

2020-09-03 19:53:04 147

原创 IOS开发Swift笔记10-属性

属性Swift中跟实例相关的属性可以分为2大类1、存储属性类似于成员变量存储在实例的内存中结构体和类都可以定义存储属性枚举不可以定义存储属性2、计算属性本质就是方法(函数)不占用实例的内存枚举、结构体、类都可以定义计算属性struct Circle { // 存储属性 var radius: Double // 计算属性 var diameter: Double { set { radius = newValue

2020-09-03 01:14:13 210

开运网、运势、测算最新源码.docx

运势源码个人运势星座塔罗牌起名祈福排盘

2021-11-17

空空如也

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

TA关注的人

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