- 博客(28)
- 收藏
- 关注
原创 RV1126+FFMPEG多路码流项目
本项目采用的是易百纳RV1126开发板和CMOS摄像头,使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如下图):通过采集摄像头的VI模块,再通过硬件编码VENC模块进行H264/H265的编码压缩,并把压缩后的数据通过FFMPEG传输到两个流媒体服务器(如同时推送到流媒体服务器:rtmp://xxx.xxx.xx.xxx:1935/live/01和rtmp://xxx.xxx.xx.xxx:1935/live/02)。
2025-09-17 01:06:51
1260
原创 RV1126的OSD模块和SDL_TTF结合输出H264文件
是这个程序的核心,它需要把每个width和height进行16位对齐,因为OSD需要处理16位对齐的数据(所谓十六位对齐可以理解为,width和height能够被16位整除)。上面是OSD叠加的代码,主要是通过RV1126的RNG模块对VENC进行OSD进行字库叠加。VENC模块的初始化实际上就是对VENC_CHN_ATTR_S的参数进行设置、然后调用。VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用。指的是输入的数值,align是要对齐的数值。:将转换后的图像数据存入。
2025-09-10 20:00:55
700
原创 视频码率和视频码率控制模式
视频码率是数据传输时单位时间内传输的数据位数,对于视频来说视频码率的单位是kbps(千比特率)每秒。处理的文件或者码流就越接近原始文件。视频码率传输的大小跟分辨率是息息相关的,下面我们来看看分辨率和视频码率的关系。
2025-08-28 22:05:13
1058
原创 QP原理讲解
QP参数调节,指的是量化参数调节。它主要是来调节图像的细节,最终达到调节画面质量的作用。QP值和比特率成反比,QP值越小码率越高,画面质量越好;反之QP值越大,码率越低,画面质量越低,而且随着视频源复杂度,这种反比的关系会更加明显。但是要注意的是,在设置QP值的时候会容易造成码率的波动,有时候画面质量提升了会导致码率大幅度提升,所以在提升画面质量的时候也需要考虑码率的情况。在编码中,亮度的QP最大值是51、色度的QP最大值是39,在真正开发中调节亮度的QP值为主。
2025-08-28 21:38:41
1226
原创 RGA模块
RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频,此时就要用到RGA模块了。比方说把一个视频用RGA进行旋转,比方说把一个视频用RGA进行镜像处理(镜像就是指物体相对于该物体反射出来的虚像,就像一个人照镜子,反射出来的图像),要注意的是RGA是直接对VI的图像进行处理,并不是对VENC数据进行处理,这一点要非常注意。RGA结构体分为:rga区域属性结构体,rga属性结构体。
2025-08-28 20:43:14
348
原创 H265码流结构的分析
下面我们来看看,时域候选列表的建立过程,它的过程如下:利用当前PU在邻近已编码图像中找到对应的PU位置的运动信息,相比于空域,时域候选表不能直接使用候选块的信息,它是需要根据参考图像位置来做对应的比例伸缩调整。对选取得空域和时域信号进行如下处理,最终得到的结果得到时域加空域 :这张图我们可以看出,inter处理过程是从空域MV列表5个里面选择2个,时域MV列表2个选择1个,紧接着去除重复的MV,然后填补零矢量(填补0,0),保留候选列表中前2个MV,最后选择出最优MV。
2025-08-27 18:58:42
1150
原创 RV1126 -VI模块讲解
RV1126的VI模块指的是视频输入模块,它的作用是读取sensor的数据。VI模块底层就是对V4L2驱动架构接口的一系列的封装,它本质上还是依赖Linux底层的V4L2驱动架构并向应用层提供对应的设备文件节点,比方说(/dev/video*)。而VI模块可以通过操作类似于/dev/video*这样的设备节点来读取摄像头数据。
2025-08-27 16:12:34
831
原创 YUV原理讲解
YUV420采样,相当于每一行扫描的时候只扫描一种色度分量(U分量或者V分量),和Y分量按照2:1的方式进行采样(也可以理解为四个Y分量对应一个UV分量)。就比方说,在第一行扫描的时候,YV分量按照2:1的方式进行采样,那么YU分量也是用2:1的方式采样,所以对于每个色度分量来说,它的水平方向和垂直方向的采样比都是2:1。YUV422采样,相当于U、V分量是以Y分量采样的一半进行采样,Y分量和UV分量按照2:1的比例进行采样(也可以理解为两个Y分量对应一个UV分量)。所以,Y分量大小:w * h;
2025-08-26 19:36:12
586
原创 FTP云盘项目编程
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP 协议提供服务。FTP是File Transfer Protocol(文件传输协议)。程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的 解析并把由服务端传递过来的处理信息通过客户端呈现给客户,实现文件的各种操作。Linux网络编程实现的FTP。
2025-08-13 10:46:00
919
原创 Linux-进程间的通信
Inter Process Communication(进程间通信):由于每个进程在操作系统中有,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。
2025-06-05 10:24:00
9461
原创 Linux-进程控制
通过系统创建一个与原来进程几乎相同的一个进程,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。结果:子进程延迟一秒运行,此时父进程已经运行结束,所以此时的子进程就成为了孤儿进程,此时孤儿进程的ppid显示的就不是父进程的pid,通过查询得知该进程被init进程收养;结果:子进程已经结束,但父进程还在运行,通过指令”ps aux“查看pid 3070此时的状态是出于一个僵尸进程,特点是:z+,<defound>;克隆后原来的进程为父进程,新进程为子进程;
2025-05-28 16:41:05
2012
原创 文件IO与标准IO的区别
结果: 并没有任何输出,因为printf函数为C库函数,且需要将库缓存写满才会输出但是并没有所以不会输出。因此fopen函数的可移植性强于open。功能:重新定位文件内部的指针。
2025-05-14 22:12:45
499
原创 C语言-字符数组
int main()// 字符串数组的列数//字符串数组的行数for(i=0;i<n;j<t;结果:int main()for(i=0;i<n-1;i++);for(j=n-1;j>0;str[j] = t;return 0;结果:通过向电脑里输入一个字符,并将这个字符反转:实现逆序输出。i<n;
2025-03-20 17:13:15
664
原创 C语言-数组
将数组中的每个元素进行比较,并按照从小到大的顺序进行排列,由于数组的长度等于n,因此将数组中的一个元素与其他元素循环比较需要5次,即n-1次,因此第一个元素进行比较的时候i=0,j=0,如果a[0]>a[1]则通过中间变量t将a[0]与a[1]的两个元素位置进行交换,实现从小到大排列,以此类推,实现所有元素的从小到达排列。其中j<n-i-1,是因为n是数组元素的个数,但是a[]的第一个元素是a[0],所以需要这样设置。初始化方式:在定义数组的时候,为数组元素赋初值。3.1一维数组初始化。
2025-03-18 20:20:08
513
原创 C语言-switch case语句
91分评级为A 65分评级为C。break语句用于强行跳出switch体,一般每个switch后面有一个break语句。当表达式的值与case后面的常量表达式的值相等时,就执行case后的语句。switc中的表达式可以是整形,字符型表达式或枚举。每个常量表达式的值各不相同,否则将出现矛盾。case常量:只起语句标号的作用。
2025-03-14 14:28:32
432
原创 C-语言:控制语句
当输入的成绩 大于等于90且小于100时,评级为A;当输入的成绩大于100或者小于0则视为输出错误,当输入的成绩大于等于80且小于90时,评级为B;当输入的成绩大于等于60且小于80时,评级为C;当输入的成绩大于0且小于60时,评级为D;使用阶梯形式来给每个同学的分数进行评级;
2025-03-14 10:05:14
293
原创 C语言-输出函数
结果:%15s表示输出15个字符,%10.5表示有效位为5,左侧补5个空格,%2.5表示有效位为5大于2,直接输出5位有效字符,%3s由于字符共为15位大于3,直接输出全部15位字符。结果:其中%8f表示输出8位,空的字符在左侧补空格,%8.1f表示输出8位字符并保留一位小数,%.2f表示输出保留两位小数。%x表示按照十六进制格式输出,1表示16的个数+4=20。此时按照8进制格式输出则8*2+3=19。若输入为a,b,c,则C1为a,c2为空格,c3为b。以下按照4个字符,4个字符,2个字符输出。
2025-03-13 15:00:10
793
原创 C语言-运算符
先判断最后一个逗号z=x+y+z>0的真假,由于大于号的优先级大于等号,则x+y+z>0为真,则z=1,在判断x+=y==z,由于==的优先级大于+=,所以y的值为1,x+=y,所以x等于2,在判断y=x+2,则有y=4.所以最后的结果为,x=2,y=4,z=1.此处x++>70为表达式1,100为表达式2,0为表达式3,x++处于后执行,先判断 x是否大于70,此时x=70,则表达式1为假输出0.结果x等于71,y=0.有一个运算量为0结果为0,全为1结果为1。位逻辑或”|“:有1为1,全0为0.
2025-03-12 15:41:47
735
原创 C语言-变量
auto int k;int j;double x;上面代码并没有给a进行赋值,输出的值是0 ,是因为用的是Code :Blocks环境,在其他环境下就不一定是0.int main()if(1)auto int a;return 0;将代码编译后会报错,这是因为auto存储类型只能在if语句里进行运用,并不能应用于整个代码。但是定义的全局变量只可以在当前文件中使用,并不能应用于其他文件。其次只要程序没有结束,该存储类型变量不会重新说明,而且保留上一次的调用存储。
2025-03-06 21:05:48
378
原创 C语言-常量
其中 采用#define进行宏定义,如图使用宏定义标识符one为常量1,TWO为one+one,并进行如下计算,但按照人们的计算思路通常是:1+(1+1)*20+10=51,但是由于宏定义只是对和标识符的简单定义,所以要实现这个计算需要在定义的时候事先加上括号。
2025-03-05 16:07:17
402
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅