自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(286)
  • 资源 (69)
  • 收藏
  • 关注

原创 F1.66 H.265编解码基础

2012年8月,爱立信公司推出了首款H.265编解码器,而在仅仅6个月之后,ITU就正式批准通过了HEVC/H.265标准,相较于之前的H.264标准有了相当大的改善。H.265主要是围绕着现有的视频编码标准H.264,在保留了原有的某些技术外,增加了能够改善码流、编码质量、延时及算法复杂度之间的关系等相关的技术。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。

2023-10-07 16:34:16 174

原创 F1.65 AAC编解码基础

AAC出现于1997年,最初是基于MPEG-2的音频编码技术,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术如PS和SBR,为区别于传统的MPEG-2 AAC,将含有SBR或PS特性的AAC又称为MPEG-4 AAC。AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术,衍生出了LC-AAC、HE-AAC、HE-AACv2共3种主要的编码。

2023-10-07 16:32:49 155

原创 F1.64 H.264码流结构

H.264分层结构H.264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H.264的解决方案是将系统框架分为两个层面,分别是视频编码层面和网络抽象层面,如图下面介绍几个重要概念:(1)原始数据比特串(String Of Data Bit,SODB)由编码器直接输出的原始编码数据,即VCL数据,是编码后的原始数据。

2023-10-07 16:31:22 130

原创 F1.63 H.264的帧间预测编码

帧间预测主要包括运动估计(运动搜索方法、运动估计准则、亚像素插值和运动矢量估计)和运动补偿。对于H.264,是对16×16的亮度块和8×8的色度块进行帧间预测编码。

2023-10-07 16:28:29 78

原创 F1.62 H.264的帧内预测编码

压缩编码大概分成4个步骤:第一步是分组,也就是将一系列变换不大的图像归为一个组,也就是一个序列,也可以叫GOP;第二步是定义帧,将每组的图像帧归分为I帧、P帧和B帧三种类型;第三步是预测帧,以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;第四步是数据传输,最后将I帧数据与预测的差值信息进行存储和传输。H.264采用的核心算法是帧内压缩编码和帧间压缩编码,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

2023-10-07 16:27:08 36

原创 F1.61 H.264编解码简介

H.264和以前的标准如H261、H263、MPEG-1、MPEG-4的编解码器实现流程没有太大区别,主要的不同在于各功能块的细节,编码流程如图9-4所示。帧内模式是指当前宏块的预测是根据周围已经已经编码的宏块单元进行预测,通常是左边和上方的宏块(同一片内,已经解码),编码时会根据周围宏块的预测模式,根据周围像素点预测出当前宏块的像素值,再与真实值相减获得残差块Dn,之后对残差块进行编码取得残差块后对其进行变换T,然后进行量化Q,送入NAL层;整个流程包括数据采集、解协议、解封装、解码、同步、渲染。

2023-10-07 16:25:38 40

原创 F1.60 VCL与NAL

对某些基于H.264的研究者来说,运动估计是怎么估计出来的一点都不重要,熵编码是如何实现的一点都不重要,重要的是知道在哪个地方提取什么参量。H.264标准的BP、EP、MP这3个档次,如图-2所示。X264是目前企业界应用最为广泛的开源编码器,主要因为X264相对于JM进行了大量的优化与简化,使其运行效率大幅提高,主要有对编码代价计算方法的简化以及添加了MMX、SSE汇编优化等部分。支持基准档次的所有特性,并支持SI和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但不支持CABAC和场编码。

2023-10-07 16:24:18 69

原创 F1.59 H.264的句法元素

在H.264中,句法元素被组织成5个层次,如图-1所示,主要包括序列(Sequence)、图像(Frame/Field-Picture)、片(Slice)、宏块(MacroBlock,MB)、子块(Sub-Block)。

2023-10-07 16:23:01 29

原创 F1.58 视频压缩编码的基本技术

H.264和以前的标准一样,也是DPCM加变换编码的混合编码模式。但它采用“回归基本”的简洁设计,不用众多的选项,获得比H.263++好得多的压缩性能;加强了对各种信道的适应能力,采用“网络友好”的结构和语法,有利于对误码和丢包的处理;应用目标范围较宽,以满足不同速率、不同解析度以及不同传输(存储)场合的需求。技术上,它集中了以往标准的优点,并吸收了标准制定中积累的经验。

2023-10-07 16:22:04 38

原创 F1.57 音频编码技术与流程

杜比AC-3根据这个特性,将各声道的音响频道划分为许多大小不等的狭窄频带,各个子频带与人耳临界频带的宽度相接近,保留有效的音频,将不同的噪声频率紧跟每个声道信号进行编码,即编码噪声只能存在于编码音频信号的频带内。它根据不同频段上大音量信号所引起的小音量信号掩蔽阈值的变化规律,对不同频段给以不同的量化步长,以便保留主要信号,而舍弃对听觉效果影响很小的成分,经过数据压缩,可取得合理的比特流,将原来大约1.5Mb/s的声音传输码率减少到0.3Mb/s,即压缩率可达到1/5。可以传输、制作可理解的各种语音信号。

2023-10-07 16:13:36 30

原创 F1.56 运动估计和补偿

运动估计的基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有象素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。运动补偿是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻)差别的方法,具体来说是描述前面一帧的每个小块怎样移动到当前帧中的某个位置去。笔者做成GIF动图,就能看出来,这两张图其实是不一样的,“人在动,背景是没有动的”,如图。第一帧是I帧,第二帧是P帧。

2023-10-07 16:11:40 46

原创 F1.55 帧内与帧间编码

I帧和P帧的编码,如图所示。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,即仅记录本帧与前后帧的差值。B帧是以前面的I或P帧和后面的P帧为参考帧,找出B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。帧内编码需要经过DCT、量化、编码等多个过程,涉及到的技术包括RGB转YUV、图片宏块切割、DCT离散余弦变换、量化、ZigZag扫描、DPCM差值脉冲编码调制、RLE游程编码、霍夫曼编码、算数编码等。P 帧只参考前面的帧,B 帧可参考后面的帧。

2023-10-07 16:09:53 30

原创 F1.54 I/P/B帧技术详解

P帧即帧间预测编码帧,需要参考前面的I帧和/或P帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感,如图所示。(1)P帧是I帧后面的编码帧(在MPEG-4的压缩视频中,一般是一个GOP里面拥有12个帧,第1个为I帧其后面跟随着11个P帧)。(5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)。(5)P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。

2023-10-07 16:07:58 82

原创 F1.53 视频编码流程

比如有连续的两幅运动图像,对一幅图像不做改变,保存本来的像素值,然后以此图像的值为基础,对另一幅图像使用公式计算来做运动预测,即把第一幅图像的某个像素的值,经过计算后,预测出第二个图像指定位置的像素值,以此类推,得到一幅完整的预测出来的图像。视频中一个连续的动作,比如画面里的男主角在篮墙背景下闭上了眼睛,这一动作的背后,是由一系列的多幅图片组成,而每幅图片的内容基本上都是一样的,唯一变化的部分就是眼睛所在图像区域,眼睛缓慢由开到闭,这块区域的像素值发生了变化。再经过量化,把很多高频的右下角的数值变为0。

2023-09-05 14:26:41 79

原创 F1.52 视频编码简介

第三步是排序编码,将上一步的输出按某种规律重新排序,让大小接近的数据尽可能在一起,然后将诸如(4,4,0,0,0,0,0)这样的序列表示为((4,2),(0,5))。同理,在语言中,由于人在说话时发音的音频是一连续的渐变过程,而不是一个完全的在时间上独立的过程,因而存在时间冗余。例如,人脸的图像有固定的结构、嘴的上方有鼻子、鼻子的上方有眼睛、鼻子位于正脸图像的中线上,等等。如果一段1min的视频,有10s画面是不动的,或者,有80%的图像面积,整个过程中都是不变的。比如一张美女与野兽的图片,如何进行压缩,

2023-09-05 14:23:17 67

原创 F1.51 视频编码之H.26x 系列

ITU-T 制定的编码标准有H.261、H.262、H.263、H.264 和 H.265 等。

2023-09-05 14:20:43 96

原创 F1.50 视频编码之MPEG-x 系列

MPEG-x系列的编码标准主要包括MPEG-1、MPEG-2、MPEG-4、MPEG-7、MPEG-21 和 MPEG-H 等。

2023-09-05 14:19:04 75

原创 F1.49 视频编码标准之ITU/ISO/JVT

为了保证编码的正确性,编码要规范化、标准化,所以就有了编码标准。研制视频编码标准的有2大正式组织,包括ISO/IEC和ITU-T。ISO/IEC 制定的编码标准有MPEG-1、MPEG-2、MPEG-4、MPEG-7、MPEG-21 和 MPEG-H 等。ITU-T 制定的编码标准有H.261、H.262、H.263、H.264 和 H.265 等。MPEG-x 和 H.26x 标准的视频编码都是采用有损压缩的混合编码方式,主要区别在于处理图像的分辨率、预测精度、搜索范围、量化步长等参数的不同,所以其应用场

2023-09-05 14:17:24 80

原创 F1.48 音频编码原理

例如,同时出现A、B两声,若A声的听觉阈值为50dB,由于存在另一个不同频率的B声,将使A声的阈值提高到64~68dB,例如取68dB,那么数值(68~50)dB=18dB,该值称为掩蔽量。比如,不存在信号频率分量的子带,被噪声掩蔽的信号频率的子带,被邻近强信号掩蔽的信号频率分量子带等,都可进行删除处理。如果在一段较窄的频段上存在两种声音信号,当一个强度大于另一个时,则人耳的听觉阈值将提高,人耳朵可以听到大音量的声音信号,而其附近频率小音量的声音信号却听不到,好像是小音量信号被大音量信号掩蔽掉了。

2023-09-05 14:15:09 47

原创 F1.47 视频采集原理

按照其用途可分为广播级视频采集卡、专业级视频采集卡、民用级视频采集卡,它们档次的高低主要是采集图像的质量不同,采集的图像指标不同。视频采集(Video Capture)把模拟视频转换成数字视频,并按数字视频文件的格式保存下来,本质上是将模拟摄像机、录像机、LD视盘机、电视机输出的视频信号,通过专用的模拟、数字转换设备,转换为二进制数字信息的过程。家用级的视频采集卡只能做到视频采集和初步的硬件级压缩,而更为低端的电视卡,虽可进行视频的采集,但它通常都省却了硬件级的视频压缩功能。

2023-09-05 14:14:22 1095

原创 F1.46 视频编码原理

运动估计技术一般将当前的输入图像分割成若干彼此不相重叠的小图像子块,例如一帧图像的大小为1280×720,首先将其以网格状的形式分成40×45个尺寸为16×16的彼此没有重叠的图像块,然后在前一图像或者后一个图像某个搜索窗口的范围内为每一个图像块寻找一个与之最为相似的图像块。这样在编码过程中就可以将当前图像中的块与参考图像运动矢量所指向的最相似的图像块相减,得到一个残差图像块,由于残差图像块中的每个像素值很小,所以在压缩编码中可以获得更高的压缩比。视频图像数据有极强的相关性,也就是说有大量的冗余信息。

2023-09-05 14:13:46 35

原创 F1.45 GOP与DTS/PTS

另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。P帧是帧间编码帧,利用之前的I帧或P帧进行预测编码。

2023-09-05 14:12:22 62

原创 F1.44 帧内编码与帧间编码

这样的方法比简单的相减可以获得能量更小的残差,从而获得更好的压缩比--当然,用来描述运动的参数不能在码流中占据太大的部分,否则就会抵消复杂的运动估计带来的好处。当然在编码的时候,未来的帧必须比当前帧更早的编码,也就是说,编码的顺序和播放的顺序是不同的。另一方面,I帧通常都会作为P/B帧解码过程中的参考帧,如果I帧的编码出现了错误,那么不仅仅是该I帧出现错误,参考该I帧的P/B帧也同样不能正确解码。I帧编码的主要流程如图。帧间预测,即运动估计,运动补偿,主要有前向预测编码图像的P帧和双向预测编码图像的B帧。

2023-09-05 14:10:23 154

原创 F1.43 压缩编码关键技术

后者量化阶距不等,又称为非线性量化,适用于幅度非均匀分布信号(如语音)的量化,即对小幅度信号采用小的量化阶距,以保证有较大的量化信噪比。非均匀量化的基本思想是,对输入信号进行量化时,大的输入信号采用大的量化间隔,小的输入信号采用小的量化间隔,这样就可以在满足精度要求的情况下用较少的位数来表示。变换编码是一种间接编码方法,其中关键问题是在时域或空域描述时,数据之间相关性大,数据冗余度大,经过变换在变换域中描述,数据相关性大大减少,数据冗余量减少,参数独立,数据量少,这样再进行量化,编码就能得到较大的压缩比。

2023-09-05 14:07:30 31

原创 F1.42 音视频压缩编码基础

数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。图像的数据量非常大,为了有效地传输和存储图像,有必要压缩图像的数据量,而且随着现代通信技术的发展,要求传输的图像信息的种类和数据量越来越大,若不对其进行数据压缩,便难以推广应用。未经编码的数据数字视频的数据量很大,存储和传输都比较困难。以一个分辨率1920×1080,帧率30的视频为例,共有1920×1080=2073600个像素,每个像素点是24b(假设采取RGB24)。

2023-09-05 14:02:03 29

原创 F1.41 视频转码原理

可以将MPEG-2全I 帧 50Mb/s 的视频源数据转换为 25Mb/s 码流的 DV 格式数据,用于笔记本移动编辑系统,同时产生一个 300×200 低分辨率的 MPEG-4 文件,使用 REAL 或者微软的 WMV 格式进行封装,通过互联网络传输至主管领导处用于审看。非线性编辑是借助计算机来进行数字化制作,几乎所有的工作都在计算机里完成,不再需要那么多的外部设备,对素材的调用也是瞬间实现,不用反反复复在磁带上寻找,突破单一的时间顺序编辑限制,可以按各种顺序排列,具有快捷简便、随机的特性。

2023-09-05 13:58:36 33

原创 F1.40 现代播放器架构

用户界面(UI)定义了终端用户的观看体验,包括皮肤(播放器的外观设计)、所有可自定义的特性如播放列表和社交分享等以及业务逻辑部分如广告、设备兼容性逻辑以及认证管理等。播放器内核是最核心的部件,播放器最底层的部分是内核如解码器等,这层的功能直接调用操作系统暴露出来的 API。解码器的主要功能在于解码并渲染视频内容,DRM管理器则通过解密过程来控制是否有权播放。DRM即数字版权管理,是指数字内容,如音视频节目内容、文档、电子书籍等在生产、传播、销售、使用过程中进行的权利保护、使用控制与管理的技术。

2023-08-04 09:33:06 96

原创 F1.39 FFmpeg播放架构与原理

解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到,还需要一个视频输出的模块。之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式,也就有了demux。(4)主线程→event_loop→refresh_loop_wait_event负责读取Video Frame Queue中的video frame,调用SDL进行显示,其中包括了音视频同步控制的相关操作。

2023-08-04 09:31:27 65

原创 F1.38 视频播放原理

几乎所有的视频播放器,如VLC、MPlayer、Xine,包括DirectShow,在播放视频的原理和架构上都是非常相似的。视频播放器播放一个互联网上的视频文件,需要经过几个步骤,包括解协议、解封装、音视频解码、音视频同步、音视频输出。视频播放器简介视频播放器播放本地视频文件或互联网上的流媒体大概需要解协议、解封装、解码、同步、渲染等几个步骤,如图。

2023-08-04 09:29:11 50

原创 F1.37 视频编解码流程

(3)离散余弦变换(Discrete Cosine Transform,DCT),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。量化的结果分为2份,一个做进一步处理,一份经过反量化(Rescale)/反DCT(IDCT)变化,结合第2步的运动补偿生成Fn对应的参考帧,供后续参考。

2023-08-04 09:27:29 59

原创 F1.36 视频编码的关键技术

为了制造更长的零游程,在编码之前,对变换系数矩阵采用Z字形扫描读取数时进行重新排列,很多像块经变换后,变换系数经过 ZigZag 排列,排在队尾的很长一串系数全是0。空间域图像的能量往往分布相对比较均匀,经过变换后,变换域中图像的变换系数间近似是统计独立的,基本去除了相关性,并且能量集中在直流和低频率的变换系数,高频率变换系数的能量很小,甚至大部分高拟系数能量接近于零。通常变换离不开量化,因为图像从空间域矩阵变换到变换域的变换系数矩阵,其系数个数并未减少,数据量也不会减少,因此并不能直接压缩数据。

2023-08-04 09:26:13 44

原创 F1.35 视频编码原理简介

视频本质上是一系列图片连续快速的播放,最简单的压缩方式就是对每一帧图片进行压缩,例如比较古老的 MJPEG 编码就是这种编码方式,这种编码方式只有帧内编码,利用空间上的取样预测来编码。形象的比喻就是把每帧都作为一张图片,采用JPEG的编码格式对图片进行压缩,这种编码只考虑了一张图片内的冗余信息压缩,如图所示,绿色的部分就是当前待编码的区域,灰色就是尚未编码的区域,绿色区域可以根据已经编码的部分进行预测(绿色的左边、下边、左下)。视频一般有5种冗余信息,包括空间冗余、时间冗余、编码冗余、视觉冗余和知识冗余。

2023-08-04 09:24:21 49

原创 F1.34 IPB帧和GOB简介

图像组(Group of picture,GOP),指两个I帧之间的距离。Reference即参考周期,指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。所以在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。IPB帧的字节大小为I > P > B。GOP解码顺序和显示顺序。

2023-08-04 09:21:38 118

原创 F1.33 YUV成像原理

视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度。所以,在视频存储中,没有必要存储全部颜色信号,可以把更多带宽留给黑白信号(亮度),将稍少的带宽留给彩色信号(色度),这就是YUV的基本原理,Y是亮度,U和V则是色度。YUV的成像过程如图。另外YUV格式还可以很方便地压缩视频,YUV的存储格式与其采样方式密切相关。主流的YUV采样方式有4种,如图所示,包括YUV4:4:4、YUV4:2:2、YUV4:2:0和YUV4:1:1。

2023-08-04 09:20:25 265

原创 F1.32 视频编码基础知识

视频为什么需要编码,关键就在于一个原始视频,如果未经编码,体积是非常庞大的。以一个分辨率1920×1080,帧率30的视频为例,共有1920×1080=2073600个像素,每个像素点是24b(假设采取RGB24)。也就是说,1秒钟视频的大小是186.6MB,1分钟大约是11GB,一部90分钟的电影,约为1000GB(约1TB)。首先是视频采集,通常会使用摄像机、摄像头进行视频采集,采集了视频数据之后,就要进行模数转换,将模拟信号变成数字信号。正因为如此,专业的视频工程师就提出,必须对视频进行压缩编码。

2023-08-04 09:18:44 59

原创 F1.31 音视频封装格式详解

封装格式即音视频容器,比如经常看到的视频后缀名mp4、rmvb、avi、mkv、mov等,这些就是音视频的容器,它们将音频和视频甚至是字幕一起打包进去,封装成一个文件,用来存储或传输编码数据,可以理解成一个容器。所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。不同的封装格式支持的视音频编码格式是不一样的,比如 MKV 格式支持比较多,RMVB 则主要支持 Real 公司的视音频编码格式。

2023-08-04 09:15:25 108

原创 F1.30 音视频封装

再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。数据封装(Data Encapsulation)就是把业务数据映射到某个封装协议的净荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。数据解封装就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业务信息数据封装和解封装是一对逆过程。封装格式也称多媒体容器,它只是为多媒体编码提供了一个“外壳”,也就是将所有的处理好的视频、音频或字幕都包装到一个文件容器内呈现给观众,这个包装的过程就叫封装,

2023-08-02 09:47:35 55

原创 F1.29 视频编码格式

(1)H.26X系列,是由ITU主导的,主要包括H.261、H.262、H.263、H.264、H.265等。H.265及高效率视频编码是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。(3)其他系列的视频编码格式包括AMV、AVS、Bink、CineForm、Cinepak、Dirac、DV、RealVideo、RTVideo、SheerVideo、Smacker、Sorenson Video、VC-1、VP3、VP6、VP7、VP8、VP9、WMV等,因为这些编码方式不常用,不再详细介绍。

2023-08-02 09:45:19 112

原创 F1.28 视频格式

视频格式非常多,包括视频文件格式、视频封装格式、视频编码格式等。比如常见的视频文件格式有MP4、RMVB、MKV、AVI 等,常见的视频编码格式有mpeg4、H.264、H.265等。下面详细介绍这3个概念。

2023-08-02 09:43:40 57

原创 F1.22 音频编码基本手段

音频编码的基本手段包括量化器和语音编码器。

2023-08-02 09:41:10 48

音视频小白入门--1wm音视频到底是什么.pdf

音视频小白入门,经典材料,分享出来 音视频小白入门,经典材料,分享出来 音视频小白入门,经典材料,分享出来 音视频小白入门,经典材料,分享出来 音视频小白入门,经典材料,分享出来

2020-08-27

福优林@Qt5小白变大牛初级篇word---第4章.pdf

容器类是隐式共享(implicitly)的,可重入(reentrant)的和线程安全的。并且在速度上进行了优化,内存占用少,内联代码扩展少,从而可以产生更小的可执行文件。 为容器遍历提供了两种迭代器(Java-style,STL-style),并且QT提供了foreach关键字,更加方便元素遍历。其中,Java风格的迭代器更容易使用,特别是对于Java工作人员来说,它提供了高层次的函数;然而,STL风格的迭代器会更高效,并且可以和Qt和STL的通用算法结合使用。 Qt中的容器和STL中的类似,也分为序列式容器和关联式容器。 序列式容器有:QList,QLinkedList,QVector,QStack,QQueue。对大部分应用程序来说,QList都是一个很好的选择。尽管它在底层被实现为一个array-list,但它为我们提供了非常快速的添加操作,包括在头部添加和在尾部添加。如果你确实需要一个linked-list,可以使用QLinkedList;如果你想确保你的元素占用连续的内存空间,可以使用QVector。而QStack和QQueue是两个提供了LIFO和FIFO语义的方便类。 除了序列式容器,Qt中还提供了关联式容器:QMap,QMultiMap,QHash,QMultiHash,QSet。这些容器中存储的都是key-value对。其中,"Multi"容器又支持一个key可以关联多个value。"Hash"容器通过使用一个hash函数而不是二分搜索提供了更快速的查找操作。

2020-07-23

福优林@Qt5小白变大牛初级篇word---第3章.pdf

第3章 Qt信号槽使用及其原理 96 3.1 Qt信号槽概念原理讲解 96 信号槽机制 96 信号是什么 96 槽是什么 97 信号与槽的关联 97 3.2 Qt的moc机制 98 moc简介 98 moc过程 98 moc小结 99 3.3 手动使用moc分析信号代码 100 编辑源代码 100 moc处理 100 分析moc文件 100 3.4 Qt Designer 中设置信号与槽 101 3.5 使用connect函数实现信号槽绑定 103 3.6 内功的修炼--底层操作系统的通信机制 105

2020-07-23

福优林@Qt5小白变大牛初级篇word---第2章.pdf

第2章 Qt的HelloWorld(GUI)及剖析 65 2.1 hello world程序创建及运行 65 2.1 hello world程序创建及运行(VS2015) 68 2.1 调试源代码 69 2.2 Qt之pro配置详解 69 2.2.1 注释 69 2.2.2 CONFIG 69 2.2.3 DEFINES 69 2.2.4 FORMS 70 2.2.5 HEADERS 70 2.2.6 INCLUDEPATH 70 2.2.7 LIBS 71 2.2.8 QT 71 2.2.9 SOURCES 71 2.2.10 TRANSLATIONS 71 2.2.11 TARGET 72 2.3 Qt之输出控制 72 2.3.1 示例代码 72 2.3.2 GUI应用程序输出 72 2.3.3 GUI程序的控制台输出 73 2.4 Qt程序的命令行方式 74 2.4.1 步骤一:命令行编译ui文件并创建项目.pro文件 75 2.4.2 步骤二:构建项目.pro文件 75 2.4.3 步骤三:命令行编译生成exe 75 2.5 Qt程序的运行和发布 76 2.5.1 设置环境变量 76 2.5.2 生成.exe程序 77 2.5.3 使用windeployqt自动复制所依赖的dll 77

2020-07-23

福优林@Qt5小白变大牛初级篇word---第1章.pdf

1.1 Qt开发环境搭建(Qt Creator5.9.8) 搭环境:有可能会头疼。 因为每次学习一门技术都要亲手搭环境,然而又没有什么技术含量和复用性,纯机械式抄教程,但确实又经常出问题,有可能会比较头疼。 无论如何,一定要亲手搭建一次。

2020-07-23

wave音频信号采集与波形图.rar

基于该资源(http://download.csdn.net/download/playbb888/1476431)修改生成的柱状图。说实在的该资源工程结构不是很合理。希望参考者不用参考该资源的设计方式。 一个vc2005实现得从麦克风采集声音并同时进行播放的程序,同时实现了波形显示功能;而且可以根据需求将采集得数据存成文件,进行进一步处理和分析;

2020-06-15

Python3简明教程之12网络编程

Python3简明教程之12网络编程 Python3简明教程之12网络编程 Python3简明教程之12网络编程

2018-08-19

Python3简明教程之11图像界面GUI

Python3简明教程之11图像界面GUI Python3简明教程之11图像界面GUI Python3简明教程之11图像界面GUI

2018-08-19

Python3简明教程之10进程和线程

Python3简明教程之10进程和线程.docx

2018-08-19

Python3简明教程之9 IO编程

Python3简明教程之9 IO编程.docx

2018-08-19

Python3简明教程之8错误和异常

Python3简明教程之8错误和异常

2018-08-19

Python3简明教程之7面向对象

Python3简明教程之7面向对象 Python3简明教程之7面向对象 Python3简明教程之7面向对象

2018-08-19

Python3简明教程之6模块

Python3简明教程之6模块 Python3简明教程之6模块 Python3简明教程之6模块

2018-08-19

Python3简明教程之5高级特性

Python3简明教程之5高级特性 Python3简明教程之5高级特性 Python3简明教程之5高级特性

2018-08-19

Python3简明教程之4函数式编程

Python3简明教程之4函数式编程 Python3简明教程之4函数式编程 Python3简明教程之4函数式编程

2018-08-19

Python3简明教程之3函数

Python3简明教程之3函数 Python3简明教程之3函数 Python3简明教程之3函数

2018-08-19

Python3简明教程之2基础

Python3简明教程之2基础 Python3简明教程之2基础 Python3简明教程之2基础

2018-08-19

Python3简明教程之1入门

Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1...

2018-08-19

数字图像处理 001

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函...

2018-08-19

opencv --大学数学

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函...

2018-08-19

Beginning Game Programming v2.0所有源码--allcodes.rar

Beginning Game Programming v2.0所有源码--allcodes.rar

2020-12-04

Windows驱动开发系列之一:小白入门经典.pdf

Windows驱动开发系列之一:小白入门经典

2020-11-09

Windowsqudong---windowsqdkf_xz7-new.rar

Windows驱动开发技术详解

2020-11-09

zlxj-windriver-12555yuandaima.rar

竹林蹊径--深入浅出Windows驱动开发12555

2020-11-09

hjdd--windows-kernel-safe--hanjiang

寒江独钓--windows内核安全编程--hanjiang

2020-11-09

课件与源码打包——qt5小白变大牛初级篇.rar

课件与源码打包——qt5小白变大牛初级篇,Qt5(C++)零基础理论与实战之初级篇, 1.带领你学习QT5/C++,从开发环境(QTCreator和VS2015两种)搭建到项目实战,从入门到精通。 2.所有章节均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的问题及解决方法(可以下载所有的电子课件与源码)。 3.本阶段主要完成Qt开发环境搭建、基于Widget的图形控件、布局管理、容器类、QT事件处理、QSS、QML等几个方面知识的学习 4.项目实战部分包括:计算器、CRM、视频播放器、视频加密器、等。 5.通过学习qt框架,进一步加深了对C++设计模式的理解。可以真正投入到实战中,能做基于QT跨平台功能强大的界面程序。

2020-07-24

福优林@Qt5小白变大牛初级篇word---第18章.pdf

第18章 Qt零基础之中级篇概览 IO操作:文件、目录、流 Qt内存管理 Qt进程与线程 二维图形 XML与Json 数据库:SQL语法、SQLite、Mysql 网络编程:Socket、tcp、udp

2020-07-23

福优林@Qt5小白变大牛初级篇word---第17章.pdf

第17章 Qt面试题分析与讲解 254 0. 什么是 qt有什么优点 254 1. QT信号槽机制的优缺点 255 2. Qt信号和槽的本质是什么 255 3. 如何实现一个自定义按钮, 255 方法一: 255 方法二: 256 4. 多线程情况下, Qt中的信号槽分别在什么线程中执行, 如何控制? 256 5. 描述Windows下一个消息从触发到处理的整个路由过程. 256 6. 使用编码实现Lable显示“hello world”的功能 256 7. 编写代码实现调用槽函数退出的 quit 257 8. 编程实现 spinbox 和 slider的交互界面 257 9. 如何编译运行 qt 程序命令是什么 258 10. 如何将UI界面文件转化成代码的.h文件 259 11. QApplication QGuiApplication QCoreApplication 区别和联系 259 12. QApplication的主要功能 259 13. Qt国际化的三部曲 260 14. Qt国际化的操作步骤 260

2020-07-23

福优林@Qt5小白变大牛初级篇word---第16章.pdf

视频转码 -- 操作说明 HiTT -- 福优学苑音视频转码系统,经典的B/S架构,分为Tomcat服务端和浏览器端。 服务端负责对视频文件进行转码,浏览器主要上传视频文件、查看进度、管理视频等。 第1步:创建转码模板,设置各种转码参数 第2步:创建素材类别,方便对视频进行维护 第3步:选择音视频文件,并上传(断点续传、大文件切片) 第4步:正在转码的视频列表,显示实时进度 第5步:视频列表,包括转码完成、正在转码、转码失败 第6步:素材列表,包括音频列表、视频列表、图片列表

2020-07-23

福优林@Qt5小白变大牛初级篇word---第15章.pdf

视频加密   视频加密 -- 操作说明 音视频加密,经典的C/S架构,分为服务端和客户端。 服务端负责对视频文件进行加密,客户端主要负责播放视频(边解密边播放)。 第1步:选择音视频文件 第2步:加密设置(密码设置、加密模式、一机一码、共享模式、绑定硬盘主板显卡) 第3步:播放设置(次数限制、预览限制、时间限制、播放比例、视频水印设置) 第4步:防盗设置(防止录屏、禁止截屏、禁止虚拟机播放、防盗问答) 第5步:输出设置(输出文件夹) 播放器:一机一码,边解密边播放,保护视频版权

2020-07-23

福优林@Qt5小白变大牛初级篇word---第14章.pdf

Qt视频播放器 Qt对音视频的播放和控制、相机拍摄、收音机等多媒体应用提供了强大的支持。 Qt5使用了全新的Qt Multimedia模块来实现多媒体应用,Qt4中用来实现多媒体功能的Phonon模块已经被移除。 新的Qt Multimedia模块提供了丰富的接口,可以轻松地使用平台的多媒体功能。例如进行媒体播放、使用相机和收音机等。 QMediaPlayer简介 QMediaPlayer播放视频要在界面上显示出来,还需要其他类进行辅助,比如QVideoWidget类。:编解码 QVideoWidget继承自QWidget,所有它可以作为一个普通窗口部件进行显示,也可以嵌入到其他窗口。:播放窗口 将QVideoWidget指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面。 二者组合,可以播放视频: player = new QMediaPlayer; videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); videoWidget->show(); player->play(); QVideoWidget简介 QvideoWidget是一个用来展示视频的类,需要先定义一个QMediaPlayer对象,然后将QMediaPlayer的VideoOutput设置为QVideoWidget对象即可 QVideoWidget属性 名称 类型 说明 aspectRatioMode Qt::AspectRatioMode 显示比率 brightness int 亮度 contrast int 对比度 fullScreen bool 是否全屏 hue int 色调 mediaObject QMediaObject *const 视频媒体对象 saturation int 饱和度 error: C1083: 问题:qt creator报错 error: C1083: 无法打开包括文件:“QMediaPlayer” 解决:QT += multimedia multimediawidgets 如何获取duration QT关于QMediaplayer 的duration()获取的音视频时间长度为0的问题。   在QT中,使用QMediaplayer类可以很方便地实现视频的播放,而在QMediaplayer类中有个duration函数可以直接获取所打开视频的总时间长度。 但使用后你会发现duration()返回的居然是个0。   官方解释: The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins, connect to the durationChanged() signal to receive status notifications. 在初始回放开始时可能不可用,请连接durationChanged()信号以接收状态通知。 即我们只需要写个槽函数,在槽函数里面调用duration()就可以接收到正确的时间 例: //第一步:连接槽函数,信号为QMediaPlayer自带的durationChanged,槽就是自己定义的getduration,注意参数类型要一致 QObject::connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(getduration(qint64))); //第二步:写槽函数,mediaplay为类名,不同类需要修改这个类名,playtime为总时长 void Widget::getduration(qint64 playtime) { // 在这里获取duration(...) playtime = player->duration(); } 经过以上两步就可以获得正确的时间啦。 以下再附上把获得的时间转化为时分秒的函数: QString Widget::convertMillisecToString(qint64 millisec) { int h,m,s; millisec /= 1000; //获得的时间是以毫秒为单位的 h = (int)millisec / 3600; m = ((int)millisec - h*3600)/60; s = (int)millisec - h*3600 - m*60; //把int型转化为string类型 QString strFormat = QString("%1:%2:%3") .arg(h,2,10,QChar('0')) .arg(m,2,10,QChar('0')) .arg(s,2,10,QChar('0')); return strFormat; } 双击全屏显示

2020-07-23

福优林@Qt5小白变大牛初级篇word---第13章 .pdf

第13章 Qt项目实战之信息管理系统 13.1 CRM简介 概念 CRM软件全名是客户关系管理软件(Customer Relationship Management),同时这个软件也可以处理一些数据,包括:客户、产品、关系、销售、财务、等等。 企业客户业务 CRM 的中心是实时客户信息库,它具有先进强大的预构建结构可帮助用户捕获、存储不同类型的信息,然后根据用户的需求进行过滤,实时展示用户所需的信息。 客户信息库的任何数据更新,与其相关的其它信息也会相应地实时自动更新。 企业客户生命周期管理 企业客户的基本信息 企业客户的联系信息 企业客户的兴趣与偏好 企业客户的财务与信用信息 企业客户的交互、问题和行动 企业客户的交易历史与价值 企业客户的营销管理 内容营销 关系营销 社交媒体营销 一对一个性化营销 电子问卷调查 电子邮件营销 搜索引擎营销 企业客户的财务与信用 企业客户业务 CRM 支持记录每个企业客户的财务报告,信用评级以及应收账款信息等。这些信息能帮助您的团队更好地确定报价与选择适当的收款方式,以降低回款风险。 有良好财务状况的客户是价值更高的客户,您可以根据客户的财务信息更准确地识别高价值的客户并寻求长期的合作关系。 13.2 UI设计:巧妙使用Layout 总共两个界面,主界面和信息添加界面。 主界面结构: 左侧:数组件,QTreeWidget 右侧: 右上:按钮(添加、删除) 右下:表格组件,QTableWidget 布局: 主布局: 水平结构,QHorizontalLayout 右侧布局: 垂直结构,QVerticalLayout 信息添加界面: 主布局: QGridLayout 字段结构: QFormLayout

2020-07-23

福优林@Qt5小白变大牛初级篇word---第12章.pdf

第12章 Qt项目实战之计算器 12.1 简介 计算器的样子模仿Windows自带的计算器,但是简化了一些。 一整体方案设计 本设计总体可分为两个部分,界面设计部分和内部逻辑部分。 界面设计入上图所示一些按钮和一个QLineEdit(用于输入数字和显示结果)和QLabel(用于显示运算表达式)。 主要是采用界面设计师(直接拖拽设计)和代码设计部分。 基本上外部的垂直布局里面套了个网格布局(网格布局里主要是处于下方的按钮) 12.2 MVC框架 MVC(Model-View-Controller)框架 其实从字面意思来说,只能了解各大概,view应该是视图的意思,那Model和Controller究竟是什么? Model: 处理数据逻辑和程序运行状态,实体类,用于存储属性值 View: 则只负责显示 Controller: 通常负责处理用户交互的部分,从视图读取数据与用户输入,并向模型发送数据;这里顺便提一下,在Qt里面我们并没有Controller的概念,而是Delegate(委托),意义很明显:控制器委托模型来处理数据,模型委托控制器来做数据的交互。 这样的框架好处是很明显的: - 高重用性:一个模型可以有多个视图,同样一个视图也可以对应多个模型 - 低耦合:因为模型与视图分离,所以可以独立的拓展和修改而不产生相互的影响 - 快速开发和便捷部署 12.3 创建工程 打开Qt Creator 点击New Project 创建工程  选择Qt Widgets Application,点击Choose, 按照提示,填写名称和路径,然后下一步。 选择基类是QWidget,类名为Widget.(或者自己取名) 然后下一步。 然后点完成。 程序创建好了。 12.4 界面设计(View) 双击后缀为.ui的文件,进入设计界面。 我们在这里进行布局。 模仿windows系统自带计算器,我们设计的计算器的界面为: 设计界面的操作比较简单:上面是一个LineEdit和一个Label,用于显示, 下面是4x4的按钮区(Push Button)。 设置好界面后,为了方便后面的操作,我们要修改它们的名字。 例如按钮C:功能是清除,名字就改成btn_clear.

2020-07-23

福优林@Qt5小白变大牛初级篇word---第11章.pdf

11.1 Qml简介 从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。 而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。 在 Qt 5 中, QML 有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言。 也就是说,使用 Qt 5,我们不仅可以使用 C++ 开发 Qt 程序,而且可以使用 QML。 虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。 在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持触摸操作、流畅的动画效果等。但是在 Qt 5 中,QML 已经不仅限于开发手机应用,也可以用户开发传统的桌面程序。 QML 文档描述了一个对象树。 QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。 Qt QML模块为QML语言开发应用程序和库提供了一个框架。 它定义并实现了语言及其引擎架构,并且提供了一个接口,允许应用开发者以自定义类型和集成JavaScript与C++代码的方式来扩展QML语言。 Qt QML模块提供了QML和C++两套接口。 QML(Qt Meta-Object Language,Qt元对象语言)是一种用于描述应用程序用户界面的声明式编程语言。 QML是一种高可读性的语言,可以使组件以动态方式进行交互,并且允许组件在用户界面中很容易地实现复用和自定义。 QML允许开发者和设计者以类似的方式创建高性能的、具有流畅的动画效果的、极具视觉吸引力的应用程序。 QML提供了一个具有高可读性的类似JSON的声明式语法,并提供了必要的JavaScript语句和动态属性绑定的支持。 QML语言和引擎框架由Qt QML模块提供。 11.2 创建一个Qt Quick应用

2020-07-23

福优林@Qt5小白变大牛初级篇word---第10章.pdf

10.1 何为Qt样式表 由于Qt样式表的引入,定制Qt部件的外观样式变得非常简单。 Qt样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS), 通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(), 你可以为一个独立的子部件、整个窗口,甚至是整个个应用程序指定一个样式表。 样式表是通过QStyle的一个叫做QStyleSheetStyle的特殊子类来实现的。 这个特殊的子类实际上是其他的系统特定风格类的包裹类,它会把通过样式表指定的自定义外观风格应用在底层的系统特定风格之上。 10.2 样式表语法基础 Qt样式表与CSS的语法规则几乎完全相同,如果你已经了解了CSS,完全可以跳过本节。 一个样式表由一系列的样式规则构成。每个样式规则都有着下面的形式: selector { attribute: value } 选择器(selector)部分通常是一个类名(例如QComboBox),当然也还有其他的语法形式。 属性(attribute)部分是一个样式表属性的名字, 值(value)部分是赋给该属性的值。 为了使用方便,我们还可以使用一种简化形式: selector1, selector2, ..., selectorM { attribute1: value1; attribute2: value2; ... attributeN: valueN; } 这种简化形式可以同时为与M个选择器相匹配的部件设置N种属性。 例如: QCheckBox, QComboBox, QSpinBox { color: red; //字体颜色:红 font: bold; } 这个规则设置了所有的QCheckBox、QComboBox和QSpinBox的前景色、背景色和字体。 10.3 方箱模型 在样式表中,每个部件都被看作是一个由四个同心相似的矩形组成的箱体: 空白(margin)、边框(border)、填充(padding)和内容(content)。 对于一个平面部件——例如一个空白、边框和填充都是0像素的部件——而言,这四个矩形是完全重合的。 空白区域位于边框外,并且总是透明的。 边框为部件提供了四周的框架,其border-style属性可以设置为一些内置的框架风格,如inset、outset、solid和ridge。 填充在边框和内容区域之间提供了空白间隔。 10.4 前景与背景 部件的前景色用于绘制上面的文本,可以通过color属性指定。 背景色用于绘制部件的填充矩形,可以通过background-color属性指定。 背景图片使用background-image属性定义,它用于绘制由background-origin指定的矩形区域(空白、边框、填充或内容)。背景图片在矩形区域内的对齐和平铺方式可以通过background-position和background-repeat属性指定。 QFrame { margin: 10px; border: 2px solid green; padding: 20px; background-image: url(qt.png); background-position: top right; background-origin: content; background-repeat: none; } 在这个例子中,QFrame四周的空白、边框和填充值都是一样的。 实际上margin属性可以在上下左右四个方向分别指定我们需要的不同值,例如: QFrame { margin: 14px 18px 20px 18px; } 同时,我们也可以分别指定margin-top、margin-right、margin-bottom、margin-left四个属性。 QFrame { margin-top: 14px; margin-right: 18px; margin-bottom: 20px; margin-left: 18px; } 虽然目前我们仅仅使用了QFrame作为例子,但是我们也可以同样的将这些属性应用于任何一个支持方箱模型的Qt部件,例如:QCheckBox、 QLabel、QLineEdit、QListView、QMenu、QPushButton、QTextEdit、和QToolTip。 10.5 可缩放样式 在默认情况下,通过background-image指定的背景图片会自动重复平铺,以覆盖部件的整个填充矩形(即边框里面的那个区域)。 ///注意区别: 如果我们想创建能够随着部件大小自动缩放而不是平铺的背景,我们需要设置一种称之为“边框图片”的东东。 注意 “边框图片”可以通过border-image属性指定,它同时提供了部件的背景和边框。 一个“边框图片”被分为九个部分(九宫格),有点向tic-tac-toe游戏的棋盘。 当一个部件的边框被填充时,四角的格子通常不会发生变化,而其余的五个格子则可能被拉伸或平铺以填充可用空间。 当指定一个“边框图片”时,除了图片本身,我们还必须指定用来分割九宫格的四条分割线。同时我们还必须指定非边角的格子是应该平铺还是拉伸,以及边框的宽度(用来确定边角格子的大小,防止边角被缩放变形)。 例如,下面的样式表定义了上图中的button: QPushButton { border-width: 4px; border-image: url(button.png) 4 4 4 4 stretch stretch; } 另外,“边框图片”还应该含有alpha通道,以使背景能够在边角处露出来。 10.6控制大小 min-width和min-height两个属性可以用来指定一个部件的内容区域的最小大小。 这两个值将影响部件的minimumSizeHint(),并在布局时被考虑。 例如: QPushButton { min-width: 68px; min-height: 28px; } 如果该属性没有被指定,最小大小将从部件的内容区域和当前样式中继承。 10.7 伪状态 部件的外观可以按照用户界面元素状态的不同来分别定义,这在样式表中被称为“伪状态”。例如,如果我们想在一个push button在被按下的时候具有sunken的外观,我们可以指定一个叫做 :pressed 的伪状态。 QPushButton { border: 2px outset green; } QPushButton:pressed { background: gray; }

2020-07-23

第9章 Qt事件机制与原理

9.1事件机制与原理分析 9.1.1 什么是Qt事件驱动?         我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 有点抽象,Qt进行了封装        实际上a.exec()便是Qt程序进入事件消息循环, 9.1.2 图形界面应用程序的消息处理模型 回调、os的魔抓windows、linux,从用户层到 内核层,如何管理进程、线程、 Os如何处理、底层机制 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的  系统内核的消息通过事件处理转变成QT的信号 9.1.3 Qt中的事件处理 (1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.              事件处理的核心包括事件①产生、②分发、③接受和处理 ①事件的产生 谁来产生事件? 最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent, mousePressEvent,mouseReleaseEvent事件 (被封装成QMouseEvent和QKeyEvent)。 ②Qt中事件的分发 谁来负责分发事件? 对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.  对于Qt GUI程序,由QApplication来负责   ③事件的接受和处理 谁来接受和处理事件? 答案是QObject。 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责( 内存管理、内省intropection、事件处理制)之一。 任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。 9.1.4 QObject的内省机制

2020-07-23

福优林@Qt5小白变大牛初级篇word---第8章.pdf

局简介 布局管理器 布局是一种优雅而灵活的方式,可以在其容器中自动安排子部件。 每个小部件通过sizeHint和sizePolicy属性将其大小要求报告给布局,并且该布局相应地分配可用空间。 Qt Designer是一个强大的工具,用于在布局中交互式创建和排列小部件。 第7章讲述了一些窗口部件,当时往界面上拖放部件时都是随意放置的,这对于学习部件的使用没有太大的影响,但是,对于一个完善的软件,布局管理却是必不可少的。 无论是想要界面中部件有一个很整齐的排列,还是想要界面能适应窗口的大小变化,都要进行布局管理。 QLayout类 QLayout类是布局管理器的基类,是一个抽象基类,继承自 QObject 和 QLayoutItem 类,而 QLayoutltem 类提供了 一个供 QLayout 操作的抽象项目。 QLayout 和 QLayoutItem 都是在设计自己的布局管理器时才使用的,一般只需要使用 QLayout 的几个子类就可以了,分别是: QBoxLayout(基本布局管理器) QGridLayout(栅格布局管理器) QFormLayout(表单布局管理器) QStackedLayout(栈布局管理器) Qt提供的布局类以及他们之间的继承关系(如下图):

2020-07-23

福优林@Qt5小白变大牛初级篇word---第7章.pdf

第7章 Qt基于Widget的控件 137 7.1 QLabel控件 137 设置QLabel字体的大小和颜色 137 使用QLabel显示图片 138 图片自适应QLabel的大小 138 7.2 QPushButton控件 138 QPushButton的基本应用 139 QPushButton设置图片 140 7.3 QLineEdit控件 141 QLineEdit基本应用 141 QLineEdit限制输入数字 141 setPlaceholderText()设置提示文字 142 setReadOnly设置不可编辑 142 setMaxLength()设置可以输入的最多字符数 142 setEchoMode()设置模式 142 7.4 QTextEdit控件 143 简介 143 提示占位文本 143 文本内容设置 144 7.4 QPlainTextEdit控件 145 QPlainTextEdit简介 145 QPlainTextEdit富文本 145 QPlainTextEdit用法 145 7.5 QSpinBox控件 146 QSpinBox简介 146 QSpinBox的主要属性 147 QSpinBox案例分析 147 7.6 QRadioButton控件 148 简介 148 在UI界面中加入QRadioButton控件 148 对QRadioButton控件进行分组 149 多个QRadioButton控件响应同一个槽函数 149 7.7 QCheckBox控件 152 简介 152 QCheckBox开启三态模式 152 在UI界面中加入QCheckBox控件 153 stateChanged()信号 153 猜猜你喜欢 154 7.8 QSlider滑动条控件 155 QSlider简介 155 QSlider案例 156 7.9 QComboBox下拉选择框 157 QComboBox简介 157 QComboBox列表项的访问 157 QComboBox的currentlndexChanged信号 157 QComboBox添加图标 159 用代码添加项 159 添加项 159 7.10 列表框QListWidget类 160 QListWidget简介 160 列表项的显示设置 161 列表框常用操作 162 添加操作 162 删除操作 162 7.11 表格控件QTableWidget 163 简介 163 界面设计器中编辑 163 代码方式修改QTableWidget 164 7.12 树控件QTreeWidget 167 简介 167 操作步骤与分析 167 7.13 Qt的日期、时间、日历等控件 169 QDateEdit控件 169 QDateTimeEdit控件 169 QCalendarWidget控件 170 7.14 QDialog 171 简介 171 操作 171 QMessageBox 172 QFileDialog 173 QFontDialog 174 QColorDialog 175

2020-07-23

福优林@Qt5小白变大牛初级篇word---第6章.pdf

主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和其他一些相关的类共同完成主窗口的管理。 QMainWindow类拥有自己的布局,见下图 (1).菜单栏(QMenuBar) 菜单栏包含了一个下拉菜单项的列表,这些菜单项由QAction类实现。 位于窗口顶部,一个主窗口只能有一个菜单栏。 (2).工具栏(QToolBar) 工具栏用于显示一些常见的菜单项,也可以插入其他窗口部件,可以移动。 一个主窗口可以拥有多个工具栏。 (3).中心部件(CenterWidget) 应用程序的主要功能实现区域。 一个主窗口只能有一个中心部件。 (4).Dock部件(QDockWidget) Dock部件常被称为停靠窗口可以停靠在中心部件的四周,像工具箱一样。 一个窗口可以拥有多个Dock部件。 (5).状态栏(QStatusBar) 状态栏用于显示程序的一些状态信息,在主窗口的最底部。 一个窗口只能拥有一个状态栏。 注意:QMainWIndow类中默认提供了一个菜单栏、一个工具栏、一个中心区域和一个状态栏,而Dock部件是需要自己添加的。

2020-07-23

福优林@Qt5小白变大牛初级篇word---第5章.pdf

Qt Widgets模块提供了一组UI元素来创建经典的桌面风格的用户界面。 1.Widgets概述 QWidget类是所有用户界面对象的基类。 头文件:要包含模块类的定义,请使用以下指令: #include 库文件:要链接模块,请将以下行添加到您的qmake .pro文件中: QT += widgets 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。 每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。 一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。 5.3.1 QWidget简介 在 Qt 中,我们将窗口和控件统称为部件(Widget) QWidget类是所有用户界面对象的基类,被称为基础窗口部件。 像主窗口、对话框、标签、还有按钮、文本输入框等都是窗口部件。 这些部件可以接受用户输入,显示数据和状态信息,并且在屏幕上绘制自己。 5.3.2 窗口与控件 QT把没有嵌入到其它部件的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的widget和label一样,QMainWindow和大量的QDialog子类是最一般的窗口类型,窗口就是没有父部件的部件,所以又称为顶级部件。 窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等。 控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。 一个程序可以有多个窗口,一个窗口也可以有多个控件。

2020-07-23

空空如也

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

TA关注的人

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