视频技术基础知识
一、视频图像基础
- 像素:图像的基本单元,即一个带有颜色的小块
- 分辨率:图像的大小或尺寸,用像素个数来表示。原始图像分辨率越高,图像就越清晰
- 位深:存储每位像素需要的二进制位数;位深越大,能够表示的颜色值就越多,色彩越丰富真实
- 跨距(Stride):图像存储时内存中每行像素所占用的空间。需要正确的设置,否则会出现花屏
- 帧率:1秒中内图像的数量,单位FPS
- 码率:视频在1s内的数据量的大小。一般码率越高,视频清晰度越高,存储时占用内存空间就越大,传输时使用流量越多,但还需要结合压缩算法和压缩速度综合考虑
二、图像颜色空间
- 颜色空间分类
RGB:指图像的每一个像素都是分别存储R、G、B三个值,且三个值依次排列存储。顺序不一定是R-B-G,RGB三个颜色有相关性,采集和渲染的时候是RBG
YUV:图像将亮度信息 Y 与色彩信息 U、V 分离开来。Y 表示亮度,是图像的总体轮廓,称之为 Y 分量。U、V 表示色度,主要描绘图像的色彩等信息,分别称为 U 分量和 V 分量 - YUV分类
YUV 4:4:4,每一个 Y 对应一组 UV
YUV 4:2:2,每两个 Y 共用一组 UV
YUV 4:2:0,每四个 Y 共用一组 UV - YUV存储方式
Planar:先连续存储所有像素点的Y,然后接着存储所有像素点的U/V,之后再存储所有像素点的V/U
Packed:先存储完所有像素的Y,然后U、V连续的交错存储
Tips:U和V在一张图片中顺序固定,不同图片U和V谁在前不一定 - YUV类型和存储类型关系

I444:YUV顺序
YV24:YVU顺序
NV16:先存储完 Y,之后 U、V 连续交错存储
NV61:先存储完 Y,之后 V、U 连续交错存储
YU16(I422):YUV顺序
YV16:YVU顺序
NV12:先存储完 Y,之后 U、V 连续交错存储
NV21:先存储完 Y,之后 V、U 连续交错存储
YU12(I420):YUV顺序
YV12:YVU顺序 - Color Range
Full Range:R、G、B取值范围都是0~255
Limited Range:R、G、B取值范围是16~235 - RBG与YUV互转规范
BT709:高清的标准
BT601:标清的标准 - RBG与YUV转换公式

三、缩放算法
- 图像的缩放算法:插值算法、AI 超分算法
- 插值算法:使用周围已有的像素值通过一定的加权运算得到“插值像素值”,包括:最近邻插值算法(Nearest)、双线性插值算法(Bilinear)、双三次插值算法(BiCubic)
- 缩放的基本原理:图像的缩放就是将原图像的已有像素经过加权运算得到目标图像的目标像素。主要包括两个部分:一个是像素位置映射过程;一个是映射位置像素的插值过程。
- 像素位置映射过程:假设原图像的分辨率是w0xh0,我们需要缩放到w1xh1。那我们只需要将目标图像中的像素位置(x,y)映射到原图像的(xw0/w1,yh0/h1),再插值得到这个像素值就可以了,这个插值得到的像素值就是目标图像像素点(x,y)的像素值
- 映射像素的插值过程:

四、编码原理
- 宏块:对于每一帧图像,划分成一个个块来进行编码。例如:16x16(H264、VP8),32x32(H265、VP9),64x64(H265、VP9、AV1),128x128(AV1)
- 图像的数据冗余
空间冗余:相邻的块很多时候都有比较明显的相似性
时间冗余:前后两帧图像的变化是比较小的,相似性很高
视觉冗余:人的眼睛对于图像中高频信息的敏感度是小于低频信息的
信息熵冗余:文件压缩 - 编码原理
1)帧内预测:为了提高熵编码的压缩率,先将当前编码块的相邻块像素经过帧内预测算法得到帧内预测块,再用当前编码块减去帧内预测块得到残差块,从而去掉空间冗余
2)帧间预测:类似于帧内预测,在已经编码完成的帧中,先通过运动搜索得到帧间预测块,再与编码块相减得到残差块,从而去除时间冗余
a)参考帧:预测块所在的已经编码的图像
b)运动矢量:预测块在参考帧中的坐标值(x0, y0)与编码块在编码帧中的坐标值(x1, y1)的差值(x0 - x1, y0 - y1)
c)运动搜索:在参考帧中去寻找预测块的过程
3)DCT 变换(离散余弦变换)和量化:将残差块变换到频域,分离高频和低频信息。由于高频信息数量多但大小相对较小,又人眼对高频信息相对不敏感,我们利用这个特点,使用 QStep 对 DCT 系数进行量化,将大部分高频信息量化为 0,达到去除视觉冗余的目的
a)量化步长QStep:DCT变换块的系数都同时除以一个值,QStep越大得到量化后的系数就会越小,一般用量化参数QP(和QStep有对应映射表)
b)编码时:QStep 乘以量化后的系数得到变换系数,有损编码
c)QP 值越大,损失就越大,从而画面的清晰度就会越低,0的概率越大,压缩率越高
4)熵编码(以行程编码为例):视频编码中真正实现“压缩”的步骤,主要去除信息熵冗余。在出现连续多个 0 像素的时候压缩率会更高 - 编码标准系列
H264->H265
VP8->VP9->AV1

- 技术选型
清晰度:AV1>H265>H264
专利费:AV1免费、H264收费、H265费用极高
压缩率:AV1>H265>H264
耗时:H264<H265<AV1
硬件支持:H264>H265>AV1 - 使用场景
屏幕编码:使用AV1, AV1原生标准就支持屏幕编码的优化
浏览器:VP9或AV1,浏览器原生不支持H265
机器性能:性能差机器使用H264、VP8,中高等机器可以考虑H265
性价比较高:H264
五、H264编码
- 帧类型

IDR帧:立即刷新帧,特殊的I帧。IDR 帧之后的帧不能再参考 IDR 帧之前的帧,截断了编码错误的传递。大多数情况下还是直接使用 IDR 帧,不适用普通的I帧
I的压缩率是7(跟JPG差不多),P是20,B可以达到50 - GOP(图像组):包含一个 IDR 帧到下一个 IDR 帧的前一帧中的所有帧。关键帧间隔,IDR帧之间的间隔,越大压缩率越高,但丢关键帧时可能导致花屏和卡顿,一般 RTC 和直播场景可以稍微大一些,而点播场景一般小一些
- Slice:图像内的层次结构就是一帧图像可以划分成一个或多个 Slice,而一个 Slice 包含多个宏块,且一个宏块又可以划分成多个不同尺寸的子块
注:帧都是以 Slice 的方式在码流中呈现 - H264 码流格式
1) Annexb 格式:使用起始码“00 00 00 01”或“00 00 01”来表示一个编码数据的开始,图像编码中和起始码撞车的数据会被替换成默认的字节串,解码时需要逆转换。套娃?

2)MP4 格式:在图像编码数据的开始使用了 4 个字节作为长度标识

- H264参数集:
1)SPS(基础图像信息):主要包含图像的宽、高、YUV 格式和位深等基本信息
2)PPS(基础编码参数):主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息 - H264码流:主要是由 SPS、PPS、I Slice、P Slice和B Slice 组成,且每一个都封装在NALU(网络抽象层单元)中

7、常见问题
1)多Slice时如何判断哪几个Slice是同一帧的?
在Slice Header开始的地方有一个first_mb_in_slice的字段,表示当前Slice的第一个宏块MB在当前编码图像中的序号,0表示新帧中的第一个slice
2)如何从 SPS 中获取图像的宽高(分辨率)?
在SPS中有几个字段用来表示分辨率的大小。我们可以解码出这几个字段并通过一定的规则计算得到分辨率的大小
3)如何计算得到QP值?
根据PPS初始基础QP、Slice QP偏移量、宏块QP偏移量
六、帧内预测(空间冗余)
- 帧内预测:通过利用已经编码的相邻像素的值来预测待编码的像素值,最后达到减少空间冗余的目的
- 在H264标准里面,块分为宏块和子块
1)宏块大小是16x16,其中亮度块为16x16,色度块为8x8
2)帧内预测中亮度块和色度块是分开独立进行预测的
3)16x16 的亮度块可以继续划分成16个4x4的子块 - 4x4亮度块的帧内预测模式:8种方向模式和一种DC模式,方向模式指的是预测是有方向角度的
1)Vertical 模式:指当前编码亮度块的每一列的像素值,都是复制上边已经编码块的最下面那一行的对应位置的像素值,同一列像素值都一样


2)Horizontal 模式:指当前编码亮度块的每一行的像素值,都是复制左边已经编码块的最右边那一列的对应位置的像素值,同一行像素值都一样


3)DC 模式:指当前编码亮度块的每一个像素值,是上边已经编码块的最下面那一行和左边已编码块右边最后一列的所有像素值的平均值,块中每一个像素值都是一样的


4)Diagonal Down-Left 模式:上边块和右上块的像素通过插值得到。如果上边块和右上块不存在则该模式无效


5)Diagonal Down-Right 模式:需要通过上边块、左边块和左上角对角的像素通过插值得到。如果这三个有一个不存在则该模式无效


6)Vertical-Right 模式:需要通过上边块、左边块以及左上角对角的像素插值得到的。必须要这三个都有效才能使用,否则该模式无效


7)Horizontal-Down 模式:需要通过上边块、左边块以及左上角对角的像素插值得到。必须要这三个都有效才能使用,否则该模式无效


8)Vertical-Left 模式:通过上边块和右上块最下面一行的像素通过插值得到。如果这两种块不存在则该模式不可用


9)Horizontal-Up 模式:通过左边块的像素通过插值得到的。如果左边块不存在,则该模式不可用


- 16x16亮度块的帧内预测模式
1)Vertical模式:同4x4
2)Horizontal模式:同4x4
3)DC 模式:同4x4
4)Plane模式:Plane预测块的每一个像素值,都是将上边已编码块的最下面那一行,和左边已编码块右边最后一列的像素值经过下面公式计算得到的

- 8x8色度块的帧内预测模式
1)Vertical模式:同16x16
2)Horizontal模式:同16x16
3)DC 模式:同16x16
4)Plane模式:同16x16 - 预测模式的选择方法:主要有计算残差块绝对值之和、将残差块做 Hadamard 变换之后再求和、率失真优化等几种方案来得到 cost,然后我们取 cost 最小的模式作为帧内预测模式
率失真优化的思想:我们一般会在失真和码流大小之间平衡,通过调整QP值,尽量找到在一定码率下,失真最小的模式作为最优的预测模式
七、帧间预测(时间冗余)
- 帧间预测相比于帧内预测:参考的已编码块在其他图像中;有单参考和多参考,即参考一个图像或者多个图像;前向参考帧 P帧,双向参考帧 B帧(B帧先分别得到两个预测块,加权平均得到最终的预测块)
- 帧间预测块大小:亮度 16x16, 16x8, 8x16, 8x8(又可分为8x4, 4x8, 4x4),YUV 4:2:0 中色度块宽高是亮度块的一半(1/4)
- 在已经编码的帧里面找到一个块来作为预测块,这个已经编码的帧称之为参考帧
注:通常P 帧中的所有块都参考同一个参考帧,并且一般会选择当前编码帧的前一帧来作为参考帧 - 运动矢量:表示编码帧中编码块和参考帧中的预测块之间的位置的差值。把运动矢量编码到码流当中
- 运动搜索:在参考帧中找到与当前编码块差值最小(即残差块的像素绝对值之和SAD 最小)的预测块
1)全搜索算法:所有像素块全部遍历一遍,一般不用
2)钻石搜索算法:又称为菱形搜索算法,以一个菱形的模式去寻找最优预测块,计算中心点和4个角的SAD,如果中心点SAD最小则返回,否则将中心点挪到SAD最小的角对应的点重复前面的过程。如果需要编码速度快,一般选择钻石搜索
3)六边形搜索算法:以一个六边形的模式去寻找最优预测块,计算中心点和6个角的SAD,如果中心点SAD最小则取中心点、该中心点菱形的4个顶点和正方形4个顶点中SAD最小的点,否则将中心点挪到SAD最小的角对应的点重复前面的过程。要求编码质量高,同时对速度要求不高的时候,可以选择六边形搜索
注:
1)钻石搜索算法和六边形搜索算法得到的预测块不一定是全局最优预测块
2)搜索算法中每一个搜索的点都是搜索块的左上角像素点,以最佳匹配点为左上角像素的块就是预测块,并且预测块左上角像素在参考帧中的坐标(x1, y1)与编码块在当前编码帧中的坐标(x0, y0)的差值(x1 - x0, y1 - y0)就是运动矢量
3)我们一般会通过相邻已经编码块的运动矢量来预测当前块的运动矢量。这个预测的运动矢量也经常用做搜索的起点 - 亚像素插值:用插值的方式将半像素和 1/4 像素算出来,也当作一个像素。我们先通过整像素插值得到半像素,然后再通过半像素和整像素插值得到 1/4 像素。插值得到的图像跟原始的图像的对应像素点的像素值并不是完全一样的
- 亚像素运动搜索:计算整像素运动矢量->半像素和1/4像素插值->以整像素最佳匹配点菱形搜索半像素SAD->以半像素最佳匹配点菱形搜索1/4像素SAD->计算运动矢量

- 用周围相邻块的运动矢量预测一个预测运动矢量,称为 MVP,将当前运动矢量与 MVP 的残差称之为 MVD,MVD编码到码流中,MVP+MVD 就是运动矢量了
- SKIP模式:运动矢量就是 MVP,也就是说 MVD 为 (0,0),同时残差块经过变换量化后系数也都是等于 0。缩效率特别高,图像中的静止部分或者是图像中的背景部分大多数时候都是 SKIP 模式
- 帧间模式的选择:其实就是参考帧的选择、运动矢量的确定,以及块大小(也就是块划分的方式)的选择,如果 SKIP 单独拿出来算的话就再加上一个判断是不是 SKIP 模式
八、变换量化(视觉冗余)
- 视频编码过程

- 变换:空域->频域
1)DCT变换:将图像从空域转换到频域,并将图像的高频和低频信息分离开来。虽然高频信息数据多,但是幅值比较小。这样高频信息在量化的过程中能够比较容易被减少。这样可以比较有效地减少图像的视觉冗余,从而达到压缩的目的。
注: DCT 变换本身是无损的,同时也是可逆的;通常情况下 DCT 变换是在 4x4 的子块上进行的
2)Hadamard变换:Hadamard变换可以代替DCT变换将残差块快速转换到频域,以便用来估计一下当前块编码之后的大小。在H264的16x16帧内亮度块和8x8色度块中会被用到,在率失真优化做模式选择的时候使用的更多。 - 量化:其实就是一个除法操作,通过除法操作就可以将幅值变小,而高频信息幅值比较小,就比较容易被量化成 0,这样就能够达到压缩的目的。
- H264为了减少这种浮点型运算漂移带来的误差:将 DCT 变换改成了整数变换,DCT 变换中的浮点运算和量化过程合并,这样就只有一次浮点运算过程
九、其它
- 码控的原理:码控主要是为每一帧图像确定QP值的过程。如果在图像画面确定的情况下,并且QP值确定了的话,那当前图像编码后的大小就大致确定了,从而编码后的码率大小也基本确定了。常用算法有VBR动态码率、CQP恒定QP、CRF恒定码率因子、CBR恒定码率
- 卡顿问题:人眼在帧率达到10fps并且均匀播放时就不太能看出来卡顿了,如果两帧之间的播放时间间隔超过了200ms,人眼就可以明显看出卡顿了
1)帧率不够:提高帧率
2)机器性能不够,导致前处理或者编码耗时太长:使用GPU做前处理,软件编码设置为快速档
3)编码器输出码率超过实际网络带宽:对发送码率做严格的限制,防止它超过预估带宽
4)复杂帧编码后过大或者I帧比较大:可以在编码打包之后、发送之前,加一个平滑发送的模块来平滑地发送视频包(削峰填谷) - 花屏问题:
1)帧不完整:在解码一帧数据之前一定要保证帧是完整的
2)参考帧不完整
3)渲染的时候YUV格式弄错了,表现为图像的大体轮廓是对的,但是颜色是有问题的
4)解码后渲染前一定要处理好YUV的Stride问题 - 音画同步:指在音视频数据播放的时候,播放的画面和声音是需要同步的,是能对得上的
1)PTS表示的是视频帧的显示时间,DTS表示的是视频帧的解码时间,对于B帧PTS和DTS可能不一样
2)时间基:时间的单位,1/x 秒
3)音视频同步的类型:
a)视频同步到音频:指音频按照自己的节奏播放,不需要调节。是最常用的音视频同步方式
b)音频同步到视频:指视频按照自己的节奏播放,不需要调节。音频速度变化会导致音调改变,需要做到变速不变调,人耳敏感度高,这种方式是不常用
c)音频和视频都做调整同步:调节视频和调节音频相互交替进行
相关文章:
视频技术基础知识
一、视频图像基础 像素:图像的基本单元,即一个带有颜色的小块分辨率:图像的大小或尺寸,用像素个数来表示。原始图像分辨率越高,图像就越清晰位深:存储每位像素需要的二进制位数;位深越大&#…...
Windows应用之——设置定时关机
一 概述 本文介绍window设置自动关机的两种方式: cmd指令设置自动关机任务计划程序设置自动关机第三方定时关机软件 二 cmd指令设置自动关机—不推荐 2.1 自动关机-开启(管理员模式下) 依次点击‘“开始”,在“搜索程序和文件”中输入cmd,…...
华为OD机试真题Python实现【 喊七】真题+解题思路+代码(20222023)
喊七 题目 喊 7,是一个传统的聚会游戏, N 个人围成一圈,按顺时针从1 - 7编号, 编号为1的人从1开始喊数, 下一个人喊得数字是上一个人喊得数字+1, 但是当将要喊出数字7的倍数或者含有7的话, 不能喊出,而是要喊过。 假定N个人都没有失误。 当喊道数字k时, 可以统计每…...
国产蓝牙耳机哪个好用?国产好用的蓝牙耳机推荐
现如今,国产蓝牙耳机越来越受到人们关注,国产蓝牙耳机近几年的发展愈发迅猛,配置上相对于非国产蓝牙耳机来说也毫不逊色。那么,国产蓝牙耳机哪个好用?下面,我来给大家推荐几款好用的蓝牙耳机,一…...
JAVA虚拟机JVM之内存模型
内存模型 java 内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模型】是 Java Memory Model(JMM)的意思。 关于它的权威解释,请参考 https://download.oracle.com/otn-pub/jcp/memory_model-1.0…...
Java线程——常见方法
一、 常见方法 1.1 概述 ① start_vs_run:直接调用run方法并不会启动新的线程 import cn.itcast.n2.util.FileReader; import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.Test") public class Test {public static void main(String[] args) {Thread t…...
机器学习:基于逻辑回归对某银行客户违约预测分析
机器学习:基于逻辑回归对某银行客户违约预测分析 文章目录机器学习:基于逻辑回归对某银行客户违约预测分析一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.逻辑回归2.业务理解3.读取数据4.数据理解5.数据准备6.逻辑回归模型训练7.模型评…...
MySQL数据库常用命令汇总(全网最全)
目录 数据库常用命令 数据库的创建 数据表的操作 表数据的增删查改 分组与函数查询 运算符:数学运算符 连接查询 多表查询 修改语句 删除语句 字符查询like MySQL练习 总结感谢每一个认真阅读我文章的人!!! 重点&…...
Bulletproofs++
1. 引言 前序博客: Bulletproofs: Short Proofs for Confidential Transactions and More学习笔记Bulletproofs 代码解析Bulletproofs: Shorter Proofs for Privacy-Enhanced Distributed Ledger学习笔记Bulletproofs 代码解析 Liam Eagen 2022年3月论文《Bullet…...
毕业设计(1)-AFLGO的安装
AFLGO是一个模糊测试工具,在CSDN上的安装教程不多,自己在安装过程中也出现了很多教程之外的错误,最后反复安装了2天终于安装成功这里记录一下安装工程中的错误 使用的平台:Ubuntu18.04 配置: 内存:6G&…...
基于Opencv的缺陷检测任务
数据及代码见文末 1.任务需求和环境配置 任务需求:使用opencv检测出手套上的缺陷并且进行计数 环境配置:pip install opencv-python 2.整体流程 首先,我们需要定义几个参数。 图像大小,原图像比较大,首先将图像resize一下再做后续处理图像阈值处理的相应阈值反转阈值的…...
Android Gradle脚本打包
1、背景资料 1.1 Android-Gradle-Groovy-Java-JVM 之间的关系 1.2 Android Gradle Plugin Version版本 与 Gradle Version版本的对应关系 Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 -…...
平滑KDJ指标公式,减少无效金叉死叉
软件自带的KDJ指标比较敏感,在震荡上涨或者震荡下跌时会反复出现金叉死叉信号,不利于指标的使用以及进一步开发。为了减少无效金叉死叉,本文对KDJ指标公式进行平滑处理。 一、KDJ指标对比 以下为软件自带的KDJ指标,加上了图标。本…...
大势前瞻!文旅还是短视频,你弯道超车风口在这了
三年前,新冠疫情的影响波及整个各行各业行业,互联网寒冬,房地产崩盘,教培团灭,在这样的背景下,行业都进入了发展“冰雪期”。老话说大疫后必有大变,如今风雪融化,万物复苏࿰…...
JAVA基础常见面试题
1.Java接口和抽象类的区别? 接口 接口中不能定义构造器 方法全部都是抽象方法,JDK8提供方法默认实现 接口中的成员都是public的 接口中定义的成员变量实际上都是常量 一个类可以实现多个接口 抽象类 抽象类中可以定义构造器 可以有抽象方法和具体…...
通过一张照片来定位拍摄地点和网站的域名 LA CTF 2023
简介 这次打ctf遇到了一个比较经典的osint类题目,在这里分享一下如何做此类题目 题目链接: https://platform.lac.tf/challs题目简介: 你能猜出这个猫天堂的名字吗?答案是此位置的网站域。例如,如果答案是 ucla&…...
SpringBoot(powernode)(内含教学视频+源代码)
SpringBoot(powernode)(内含教学视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87484637 目录SpringBoot(powernode)(内含教学视频…...
TEMU联盟计划用意何在?做推广达人真的能收入满满吗?
据东哥近期了解,Temu在北美市场表现十分火爆,甚至冲上了AppStore下载榜第一名。Temu在美国市场上采用了类似PDD的病毒式传播策略,以实惠的产品和折扣吸引消费者并动员普通人大量传播链接和App下载,所以有了TEMU联盟计划࿰…...
【概念辨析】二维数组传参的集中可能性
一、二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针。 问题复现代码如下…...
Photon Vectorized Engine 学习记录
Photon Hash Aggregation Vectorization Photon Hash Join 的向量化的要点是:使用开放地址法。步骤: 向量化计算 hash 值基于 hash 向量化计算 bucket 下标,得到 bucket index 向量基于 bucket index 向量中记录的下标找到 bucketÿ…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
