rtmp
RTMP介绍
RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)
RTMP的基本流程:
客户端发送C0C1
服务器接收客户端的 C0C1 数据并发送 S0S1S2 数据
客户端接收服务器的 S0S1S2 数据并发送 C2 数据。
在 C0 中,这一字段指示出客户端要求的 RTMP 版本号
S0S1S2 阶段的数据包括一个字节的版本号(S0),以及两个 1536 字节的随机数据(S1和S2)。
ffmpeg
采集–推流–SRS服务器转发–拉流
音频:麦克风采集–音效变音–编码(压缩数据)解码–RTMP推流视频摄像头采集(RGB/YUV)–图像处理–H264编码–RTMP推流
拉流:WebRtc/HL/ HTTP-FLV解码+音视频同步–>输出
封装:
MPEG-4标准是一套音视频信息的压缩编码标准,
H264是视频压缩算法
MP4是音视频格式,不一定遵守MPEG-4
AVI格式:压缩标准可任意选择
FLV:视频流格式,常用于直播
ts:流媒体格式,电视直播
编码
视频编码
视频编码格式
H264
wmv
Xvid
mjpeg
音频编码
音频格式
ACC
MP3
ape
flac
解码:
视频解码为YUV–>转为RGB显示(GPU)
YUV:Y表示明亮度/灰度值,U和V表示的是色度
重采样:
像素格式:
PCM音频参数
参数
采样率simple_rate(每秒采集频率)
通道channels(左右通道)
样本大小 ...
c++面向对象
操作流123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869```# 对象## 成员函数与全局函数成员函数的传递默认参数`this`### reference### const function和function const### return reference## 构造函数复合:由内到外## 析构函数复合:由外到内## 拷贝构造## 拷贝赋值含有指针的赋值,希望可以拷贝一份(深拷贝),而不是指向同一块内存区域(浅拷贝)深拷贝:b=a;将a中的内容复制一份浅拷贝:b=1;将b指向a的内容![image-20240125135919437](https://cdn.jsdelivr.net/gh/qianxiaolin/picgo/202401251359114.png)## 实例实例的创建方式实例的生存周期## 临时对象语法:typename()```c++class complex ...
二叉树
二叉树的概念每个节点至多有两个孩子的树叫做二叉树
二叉树的存储结构12345typedef struct bTree{ char ele; struct bTree* lchild; struct bTree* rchild;}bTree;
二叉树节点使用结构体存储,包含数据域和指针域。指针域为分别指向左右孩子的指针
二叉树的创建二叉树的创建方式有很多种,在这里我们根据树的先序遍历序列来创建一个二叉树
创建根节点
1struct bTree* root=(struct bTree*)malloc(sizeof(struct bTree));
树的先序序列如下,其中##代表空节点
12char *data="ABD##E##CF##G##";int index=0;
树的结构为
12345678910111213141516void create_tree(bTree **root,char *data,int *index){ char ch; ch=data[*index]; (*index)++; /*空节点返回*/ if ...
kmp
这个时候p[i]!=p[j+1],数组不匹配时,执行j=next[j]语句,因为不匹配,这时候会让j进行后退,直到j后退到0。
kmp的代码如下
123456789101112131415161718//子串和长串下标从1开始bool kmp(char *s,int l1,char *p,int l2){ /*求next数组*/ for(int i=2,j=0;i<=l1;i++){ while(j&&p[i]!=p[j+1]) j=next[j]; if(p[i]==p[j+1]) j++; next[i]=j; } /*进行字符串配对*/ for(int i=0;i<l1;i++){ while(j<l2&&s[i]==p[j+1]) j++; if(j==l2){ cout<<"匹配成功"<<e ...
gdb
gdb调试程序调试二进制1gcc -g test.c
调试core设置生成core文件
1ulimit -c unlimited
1gcc a.out corename
调试正在执行的程序1gdb -g processid
常用调试命令1list
1run
1next
1stept
1break 行号/函数名
1watch 变量名
1print &a
1info breakpoints
1info watchpoints
1set (var=value)
ui界面
1layout [src asm split]
layout src 源代码
layout asm 汇编代码
linux系统的启动过程
BIOS和启动区CPU中的程序计数器寄PC中存放着CPU下一条执行指令的地址,在计算机通电后CPU会访问PC寄存器中的地址。英特尔的芯片PC寄存器中的初始值为0xFFFF0,这意味着在计算机通电后CPU会执行0xFFFF0这个地址空间中的地址。我们把这块地址空间中存放的程序叫做BIOS(basic input output system)。
Bios程序是硬件厂商写好的,无法改变。BIOS中的程序做的事情是将硬盘0盘0到1扇区的512字节的内容到内存0x7c00中。硬盘的0盘0道1扇区这块区域又叫做启动区MBR(Master Boot Record,主引导记录),启动区最后两个字节分别是0x55和0xaa,这是BIOS识别启动区的标志。
总结一下在计算机通电之后,CPU执行BIOS程序,BIOS搬运启动区代码到内存0x07c00中。
bootsect.s在linux0.11中,启动区的源码文件名为bootsect.s,它将被编译为二进制程序,存放在硬盘的0盘0道1扇区中,作为MBR。
当BIOS搬运完启动区的代码到内存0x7c00后,CPU将执行启动区的bootsect程序
让我们来 ...