- 博客(79)
- 资源 (1)
- 收藏
- 关注
原创 03-图像基础-视音频参数
 I帧是关键帧,属于帧内压缩,采用帧内编码方式,仅利用本帧内的数据进行编码。而I帧间隔表示每隔多少帧出现一个I帧,比如视频帧率为25,每2秒出一个I帧,即每50帧包含一个I帧49个P帧。总的来说,I帧和P帧的关系是:P帧是在I帧的基础上进行压缩的,P帧的数据量相对较小,但解码时需要参考I帧或P帧才能生成完整的画面。对于静止画面,帧率高低,对视频影响不大,但对于运动的画面,帧率越高,能表现的运动特性越明显。上面描述了帧率的概念,那什么是I帧间隔,首先我们要了解什么是I帧,什么是P帧。
2024-07-11 08:19:19
306
原创 02-图像基础-参数
我们在电脑打开一张照片,可以看到一张完整的图像,比如一张360P的图片,其对应的像素点就是640*360,可以以左上角为原点(0,0),从下图中可以得出每一个坐标点,这些坐标点就是像素点。亮度也就是图像的灰度,代码图像一个像素点的灰度值,取值范围是[0,255]其中0代表黑,255代表白色,在RGB颜色空间中,R,G,B三个参数代表了颜色分量和灰度分量,而在YUV的模型中,Y就是灰度分量,UV是颜色分量。颜色是由亮度和色度共同表示的,而色度则是不包括亮度在内的颜色的性质,它反映的是颜色的色调和饱和度。
2024-07-10 15:41:48
734
原创 01-图像基础-颜色空间
R代表红色分量,G代表绿色分量,B代表蓝色分量,以24位色来描述,R占8位,取值0-255,G占8位,取值0-255,B占8位,取值0-255。RGB是一种常用的颜色空间,比如一幅720P的图像,所对应的像素点个数是1280*720,每一个像素点由三个分量构成,分别是R,G,B。YUV是一种颜色模型,其中Y表示亮度,取值0-255,而U表示红色色度分量,V表示蓝色色度分量,U和V的取值范围均是0-255。H为120时表示绿,H为240时表示蓝,在颜色空间中,H一个值就能表示目标的颜色。
2024-07-09 08:24:25
262
原创 04-工具篇-ascan内存工具
利用C或C++编写系统时,容易出现内存方面的问题,当代码量过大时,我们需要用工具检查代码。其中ascan工具在开销小,本章对此工具的使用作一个简单介绍。就是申请了一块内存区域,释放后没有设置为NULL,后续继续使用了。检测出第12行,内存使用有问题。检测出第11行有全局缓存溢出。第7行所申请的内存没释放。检测出第11行有堆溢出。定位出第8行有栈溢出。
2024-02-28 19:16:18
638
原创 05-编码篇-H264文件分析
一般情况下,一帧图像包括多个切片,一个切片又包括切片头和切片数据,一个切片数据是由多个宏块Macroblock构成,宏块又包括宏块类型、预测类型、CPB、QP和宏块数据,而宏块数据是就是YUV的颜色分量。在一个h264视频中,最前面的数据是起始码,起始码是在NALU头部之前,假如NALU对应的Slice为一帧的开始,用十六进制00,00,00,01四个字节表示,否则用00,00,01的三个字节表示。通过前面的分析,我们可以看出常规情况下,是将视频以帧的单位进行处理,比如I帧,P帧,B帧等。
2024-02-06 11:08:02
948
原创 04-编码篇-X264的部分函数分析
x264_encoder_encode 或 x264_encoder_headers 之前使用或拷贝其中的数据。在前面的章节中,笔者有描述如何最简单的将一个YUV数据转换成H264,关于此代码涉及到如下结构体与函数,如下。x264_nal_t中的数据在下一次调用x264_encoder_encode之后就无效了,因此必须在调用。1.x264_picture_t 结构体描述一视频帧的特征,该结构体定义在x264.h中。4.x264_t是一个控制X264编码的全局性结构体,该结构体控制着视频一帧一帧的编码。
2024-01-15 15:26:06
450
原创 03-编码篇-x264编译与介绍
下载X264,地址为:http://www.videolan.org/developers/x264.html,并解压。其中bin目录下x264为可执行文件,我们通过此可执行文件来分析x264库的相关功能。通过-h信令,我们大致可以了解x264的主要功能和使用方法。4.建立一个工程,用于将YUV转成H264。2.编译后可以查看 my_build目录。
2024-01-10 16:19:07
951
原创 12-数据结构-排序
序列:arr1[] = {9,8,7,6,5,4,3,2,1,0},如果用直接插入排序,那么需要往后移动元素的次数为n*(n-1)/2,也就是45次;序列呢:arr2[] = {0,1,2,3,5,4,8,7,6,9};(2)第二次步长:step = step(这里的step为第一次的step的值)/2 => 4/2 = 2;父节点下标为k(k>0),那么其左孩子下标为2*k,右孩子下标为2*k+1。再6,3,9,8比,1,2,7,4比。先9与6,7和1,8和3,4和2比。和二路归并类似,不做具体描述。
2024-01-01 16:20:55
379
3
原创 11-流媒体-LibRtmp推H264流
另外本章内容,拉流的客户端作者使用的是vlc软件作为验证,关于vlc如何拉RTMP,本文不具体描述。所有代码编写完后,编译代码,然后执行推流进程,进程就会往服务器推流。关于服务器的启动可参考。本节内容主要描述如何将一个h264文件通过RTMP推到流媒体服务器上。工程中的内容包括第三方如下文件。
2023-12-29 17:04:29
779
原创 05-数据结构-串
* 串的头和尾指针 */int curlen;/* 串的当前长度 *///CHUNKSIZE为结点大小,可以配置。//删除S串从pos位置起的len长度的串。常规的字符匹配算法较简单,此处不举例说明。如下:采用malloc得free操作内存。//用V替换主串S中出现的与T相同的子串。//在串S的pos位置插入T。//返回T在S中的位置。1.子串位置的定位函数。二、串的常见基本操作。三、串的模式匹配算法。
2023-12-20 15:32:14
109
原创 03-数据结构-栈与队列
队列是先进先出,如上图所示,队列从队尾入队,从队头出队。队列有顺序队列,链队列和循环队列。队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现。栈:先进后出,入栈(数据进入) 和出栈(数据出去)均在栈顶操作。栈和队列是两种操作受限的线性表。如上图所示显示栈的结构。2.1 链队列的代码实现。1.1 栈的代码实现。
2023-12-19 15:12:11
533
原创 10-流媒体-RTMP编译
将h264推流给服务器,就完成了采集端的推流工作。一般在嵌入式系统常用的rtmp推流方案是rtmpdump。使用rtmp库涉及到一些编译过程,下面我们一点点描述。删除 pod2man文件:sudo rm /usr/bin/pod2man。配置makefile,注意这里的路径要按照自己电脑来。注意两个makefile要分别修改。3.编译rtmpdump。1.编译openssl。若发现下面报错,要解决。修改:Makefile。
2023-12-17 12:23:29
447
原创 01-硬件篇-高速电路板
目前视频的应用主要用在电脑或手机等直播或录制领域,更广泛的是应用于嵌入式领域。在嵌入式领域中不可避免的是要根据需求,控制成本来自己选择元器件制作电路板,视频处理属于高频信号,因而在设计电路板时,要注意高频信号的走线。核心板:6层(暂定:其实推荐8层的,但笔者为了省成本,先用6层画的试试,用自己的钱投板,所以能省就省吧)功能板:普通网口,视频输入口,普通IO,串口,USB口,TF卡槽。核心板:rv1126处理器,DDR4, eMMC等。笔者打算设计两块测试板,用于自己的学习和diy。功能板:2层(暂定2层)
2023-11-30 08:16:34
61
原创 09-流媒体-FLV解复用
客户端:RTMP拉流->解封装(FLV转H264)->解码(H264转YUV)->YUV显示(SDL2)采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流。
2023-11-17 21:06:56
175
原创 08-流媒体-RTMP拉流
客户端:RTMP拉流->解封装(FLV转H264)->解码(H264转YUV)->YUV显示(SDL2)采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流。
2023-11-17 21:05:09
563
原创 07-流媒体-RTMP推流
客户端:RTMP拉流->解封装(FLV转H264)->解码(H264转YUV)->YUV显示(SDL2)采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流。推流时要启动服务器,方法在前面章节有描述。
2023-11-17 21:03:41
603
原创 06-流媒体-YUV数据在SDL控件显示
SDL2库源码:https://download.csdn.net/download/sishen4199/88547680。完整工程:https://download.csdn.net/download/sishen4199/88547724。客户端:RTMP拉流->解封装(FLV转H264)->解码(H264转YUV)->YUV显示(SDL2)采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流。YUV视频是通过SDL控件显示,首先要编译SDL库。
2023-11-17 20:58:28
500
原创 05-流媒体-摄像头采集YUV
采集端:摄像头采集(YUV)->编码(YUV转H264)->RTMP推流客户端:RTMP拉流->解码(H264转YUV)->YUV显示(SDL2)下面是采集摄像头的YUV数据相关代码。
2023-11-12 21:41:48
224
原创 02-编码-YUV转H264
H264码流查看工具:https://download.csdn.net/download/sishen4199/88522519?YUV视频查看工具:https://download.csdn.net/download/sishen4199/88522520?整个工程目录:https://download.csdn.net/download/sishen4199/88522517?采集端:摄像头采集(YUV)->编码(YUV转H264)->RTMP推流。
2023-11-11 11:43:18
270
原创 01-解码-H264转YUV
查看H264码流的工具:https://download.csdn.net/download/sishen4199/88522519?查看YUV视频的工具:https://download.csdn.net/download/sishen4199/88522520?工程链接:https://download.csdn.net/download/sishen4199/88522521?采集端:摄像头采集(YUV)->编码(YUV转H264)->RTMP推流。
2023-11-11 11:42:51
699
原创 01-编码-H264编码原理
Fn-1是 B 帧或 P 帧:运动评估( ME )->匹配宏块得运动矢量( MC )->根据运动矢量推断下一帧->计算残差值Dn(残差值=当前帧-运动评估推断的帧)->DCT( T )->量化( Q )->拆包( Reorder )->熵编码( Entropy encode )->打成 NAL。(1)帧比如1秒钟有30帧数据,而在1秒内这30帧的数据变化并不大,并且这些帧是有很强的关联性的,我们保存第一帧数据,后面的帧可以由第一帧按某种规则预测出来。帧内预测是对整幅图中的每个宏块进行预测。
2023-11-09 19:28:08
146
原创 05-流媒体-RTMP协议介绍
RTMP是一种常见的流媒体协议,是基于TCP/IP协议模型的应用层协议,工作在TCP协议上,端口是1935。通过TCP三次握手保证传输的可靠。
2023-11-04 16:14:56
232
原创 04-流媒体-ffmpeg.c源码分析
其中transcode_step()、print_report()、flush_encoders()循环执行,下面对transcode_step()分析。avcodec_receive_packet():获取到编码后的AVPacket数据,收到的packet需要自己释放内存。show_banner()//打印输出ffmpeg的版本信息、编译时间、编译选项、类库信息。check_keyboard_interaction()//检测键盘的操作。ffmpeg_parse_options()//解析输入的命令。
2023-10-27 22:05:20
676
原创 03-工具篇-将一个大日志拆分成多个小日志
notepad++看日志特别方便,并且搜索快,其正则表达式搜索方式特别好用。但是这个日志查看工具有一个缺点,就是打不开大的日志文件。为了解决大文件问题,我专门写了一个小工具,用于将一个大的日志文件拆分成多几小的日志文件,每一个文件200M,解决日志打不开的麻烦。(1)把要拆分的文件重命名为 input.log->同时放在本地目录。比如我有一个接近2G的日志文件 ,这个软件就完成打不开了。
2023-10-26 10:12:26
228
原创 03-流媒体-ffplay.c源码分析
此两个函数,分别对应frame队列和packet队列,frame队列用于存放YUV数据,而packet队列用于存放如h264之类的数据。创建一个线程,专门用于读取媒体文件,并将媒体文件所包含的h264、aac,和字幕放在不同的packet队列,这步的过程叫解封装。4.3 video_image_display的内容是从frame队列弹出一个YUV帧,并播放。这个函数是ffplay中最重要的函数,其作用是读一个媒体文件,然后将文件进行解封装,再然后进行解码。(2)h264帧->存入packet队列。
2023-10-21 14:19:17
298
原创 02-流媒体-RTMP服务器搭建
链接:https://pan.baidu.com/s/1G_YfBXHhbbRByINstOthPw。流媒体的是所有传输音视频的总称,本节我们讨论常见的RTMP协议nginx服务器搭建和RTMP推流。ffmpeg -i xx.mp4 -f flv rtmp://ip地址:1935/live/xx。ffplay rtmp://ip地址:1935/live/xxx。弹出对话框,正是xx.mp4的内容。1.下载对应的服务器包。3.安装对应的需求库。在文件最后加如下内容。
2023-10-16 19:11:59
186
原创 08-网络篇-一步步完成网络通信
上面的章节描述了Tcp/ip四层网络模型,并介绍了每一层的常见的协议,本章来讨论一下,一个主机是怎样与外网中的另一个主机通信。5.通信过程中,通过APR协议可以得知Ip与Mac的关系,首先通过Mac表,电脑的网络包通过交换机1转发先发给路由器1。上图是一个典型的网络结构图,若主机1是电脑,主机4是服务器,主机1是怎样完成与主机4服务器的通信的呢。4.目前电脑有了自己的IP和服务器的IP(服务器IP一般是网内IP),就开始向服务器发包。3.电脑通过DNS服务器,将服务器的域名转化成IP。
2023-10-16 11:04:24
124
原创 12-网络篇-通信过程中的网络表
一网段的主机要与其他网段的主机通信,则数据会先发送给指定的网关,也就是路由器,由路由器选择网段继续通信,所以发送的数据包起始中网络层的ip地址不变,源ip地址就是当前主机的ip地址,目的ip地址就是不同网段的主机的ip地址,但是链路层由于数据要先发给路由器,那么目的mac就是路由器的mac地址,然后路由器选择其他网段,则源mac变成路由器另一个网口的mac地址,目的mac就是目标主机的mac地址,所以整个过程IP的一直不变,但是Mac地址一直再变。后面交换机可自由完成主机1至主机2的通信。
2023-10-16 11:00:15
1045
原创 13-网络篇-局域网与外网通信
NAT路由器把内网中不同的源IP地址都转换为相同的全球IP地址。但对源主机所采用的端口号,则转换为不同的新的端口号,从而完成映射与转发。(2)NAT路由器将源地址192.168.0.3转化成172.38.1.5,并发包给服务器213.18.2.4。首先我们要明确一个概念,2个IP必须都是外网IP才能相互建立起外网通信。2.上面是路由器网络内一个电脑与服务器通信,假如多个主机呢。比如我们电脑是在局域网内,如何能让它与外网服务器通信。在这里,我们可以用NAT路由器来完成通信过程,(1)电脑发包给NAT路由器。
2023-10-14 17:03:24
289
原创 11-网络篇-DNS步骤
顶级域名服务器:例如表示工商企业的 .com .top,表示网络提供商的.net,表示非盈利组织的.org等。2.本地DNS服务器(比如电信服务器DNS)有IP就返回,没有IP的情况下,本地DNS服务器向根服务器请求。7. baidu权限域名服务器告诉本地DNS服务器www.baidu.com的IP是多少。3.根服务器发现是.com结尾,让本地DNS服务器联系对应的com顶级域名服务器。5.com顶级域名服务器让本地服务器联系baidu权限域名服务器。m.baidu.com是服务器域名。
2023-10-14 16:37:21
190
原创 07-网络篇-抓包分析TCP
ack=257,ack=(4号包的seq)+(4号包的len) = 1+256=257;5、6号均为服务端发送的包,在这期间没有接收到包,所以,5、6号包的seq、ack是一样的。(1).发送方的包包括seq和len,接收方通过ack=发送方的seq+发送方的len。ack=513,ack=(6号包的seq)+(6号包的len)=1+512=513。seq=1,上次没有传输数据,seq号不变,也就是3号包的seq=1,len=0。ack=1,收到服务器seq=0同意连接,告诉服务端从seq=1传输数据。
2023-10-12 20:50:36
528
原创 09-基础篇-一步一步写MakeFile
另外在实际的开发过程中,一整个系统,不可能是一个公司能够做完成,A公司和B公司同时做项目,一般A公司不可能对B公司开源自己的代码,因而需要有一种方式将代码屏蔽,而只将功能抽象出来,这种方法就是库。从上面的Makefile看出,首先print.c和hello.c分别编译和汇编生成print.o,hello.o的机器指令,然后gcc将print.o和hello.o链接成目标程序hello。如下目录,我们重新创建了3个目录,src用于放所有c文件,obj用于放所有的.o文件,inc用于放所有的.h文件。
2023-10-12 13:47:54
115
原创 10-网络篇-DHCP获取的参数详解
如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如下图所示)。所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。我们一般在设置DNS时,会将DNS的地址写成运营商的DNS服务器地址,比如202.103.xxx.xxx为武汉电信的DNS服务器地址,通过电信的DNS服务器,可以实现如域名www.baidu.com向百度的IP地址的转换,从而让本机知道远端服务器的Ip地址。
2023-10-12 11:12:32
1006
原创 01-网络篇-网络分层和常见网络协议
网络中有对应的外网IP地址,把外网IP地址当成唯一标识符实现外网通信的身份标记,IP地址难以被人熟记(比如14.119.104.189),并且通过IP地址无法确认设备所处位置和关系,因而可以用一个网址将IP与一个字符串对应起来,这个网址实际上就对应IP地址(如:www.xxxxx.com -> 14.119.xxx.xxx),实现网站与IP之间的转换所需要的协议是DNS。在上海的主机和北京的主机要完成交互时,单纯用上海主机的mac地址和北京主机的mac地址通信实现交互是无法高效率完成的。
2023-10-09 12:31:01
237
原创 01-基础篇-常用的命令
表示此操作系统的根目录,根目录是一切目录的源头,后面的目录分级用/隔开,如/home/my/test:根目录下有一个home目录,home目录下有一个my目录,my目录下有一个test的目录或文件。本栏目是在Ubuntu操作系统进行编译与运行,代码编译和目标文件运行均是在终端完成,下面介绍一些常见的指令,用于更方便的使用终端的功能。若操作文件夹,要加上-r 或-rf。若操作文件夹,要加上-r 或-rf。若操作文件夹,要加上-r 或-rf。比如下载安装gcc交叉编译器。
2023-10-08 15:29:43
116
原创 00-工具篇-环境搭建
编译器是将代码翻译成机器能够识别的二制进,由于不同的CPU对应的架构并不相同,因而编译器和CPU是对应的,源码通过不同的编译器编译后,可以运行在对应的CPU上,比如,gcc编译c语言的代码可以运行在PC上,arm - linux-gcc编译的c语言代码可以运行在对应的arm平台上。本栏目开发所采集的操作系统是windows10+Vmware上安装的Ubuntu18,关于Vmware和Ubuntu操作系统的安装过程本文不详细描述,具体安装步骤大家可以自己百度,有很丰富的安装教程。gcc:用于编译C语言文件。
2023-10-07 12:22:40
126
原创 00-基础篇-教程内容
笔者有一个正在读大学计算机应用专业的弟弟,之前在他大一,大二时反复提醒他,一定要学好专业知识,但是感觉没有任何效果,了解了一下学习情况,发现他的专业学习了解太差,眼看正读大三,再不增加一下自己的能力,大四找工作又会是很难的事情,因而笔者就想写一个简单的教程让他一点点的学习,让他了解他这个专业到底应该学什么,怎么学,以及未来怎么发展。在所有计算机外设的应用中,最常用的肯定是网络外设,因而本栏目会对网络编程进行详细描述,在网络应用中,专门选择视频,同样也是因为视频应用在现在的移动互联网中应用最广泛。
2023-10-05 19:39:53
107
原创 01-数据结构-时间复杂度与空间复杂度
现代计算机系统,内存的容量一般都比较大,因为相比较时间复杂度而言,关注的并不是很多,后面我们主要讨论时间复杂度。无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)算法是实现解决程序问题的方法,衡量算法的好坏一般从时间和空调两个方面来衡量,按下面例子所示,k是多少,对应多少的for循环。时间复杂度是采用的: 大O符号表示法。4.线性对数阶O(nlogN)比如下面的复杂度是O(m*n)3.对数阶O(logN)为n * O(logN)5.K次方阶O(n^k)
2023-09-30 19:40:14
41
原创 01-工具篇-windows与linux文件共享
一般来说绝大部分PC上装的系统均是windows,为了开发linux程序,会在PC上安装一个Vmware的虚拟机,在虚拟机上安装ubuntu18.04,由于windows上的代码查看软件、浏览器,通信软件更全,我们想只用ubuntu进行编译,其它的功能功在windows上操作,这样需要将ubuntu上的文件夹共享和windows操作,实现这种共享需要安装samba。指令:sudo smbpasswd -a [用户名]6.使用ifconfig获取ubuntu的IP。3.添加用户名和密码。
2023-09-27 17:06:34
1581
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人