自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 Qt+FFmpeg+OpenGL实现视频播放器(4)

所以,视频和音频的同步实际上是一个动态的过程,同步是暂时的,不同步则是常态。如果视频的实际帧率与播放预期的帧率不一致,可能会导致视频播放速度变快或变慢,从而与音频的播放速度产生差异。:如果设备的处理能力不足,尤其是在播放高分辨率视频时,CPU或GPU可能会过载,从而无法及时解码视频帧,而音频通常负载较小,导致音频比视频播放得更快。在很多视频播放器和媒体系统中,音频常常作为同步的主基准,原因是人类对于声音的不连续性或延迟更敏感,而视频帧的丢失或插入对感知的影响较小。音频帧是连续的,解码和播放没有太多延迟。

2024-09-11 11:54:02 1125

原创 Qt+FFmpeg+OpenGL实现视频播放器(3)

多线程处理VideoInfo和AudioInfo类各自运行在独立的线程中,实现音视频解码和播放的并行处理。线程控制和用于控制视频的播放和停止,run()方法内执行视频解码和渲染的主循环。线程安全:通过QMutex来确保线程之间的同步与安全操作。顶点着色器负责将顶点坐标和纹理坐标传递到OpenGL管线。片段着色器使用传入的纹理坐标从纹理中采样颜色并渲染到屏幕上。您需要将每一帧视频作为纹理上传,并在paintGL()中使用 OpenGL 管线进行绘制。通过缩放视频的高度来适配的高度。

2024-09-05 16:11:05 825

原创 Qt+FFmpeg+OpenGL实现视频播放器(2)

通过这些实现,程序可以同时播放视频和音频,实现一个简单的媒体播放器功能。但是为了更流畅的播放体验,可以使用多线程来处理视频和音频的解码与播放。下一节将指导如何使用多线程来处理音频和视频解码,并播放音频和渲染视频。通过查找音频流、初始化音频解码器、配置音频输出设备,以及通过定时器不断解码音频数据并写入缓冲区,实现了音频的解码和播放。定时器的使用允许在不同的帧率下播放视频,并且可以轻松控制播放和暂停的状态。在这里,音频格式被设置为 48kHz 的采样率,立体声,使用浮点数格式。用于定时触发视频帧的解码和渲染。

2024-09-03 16:12:34 1108

原创 Qt+FFmpeg+OpenGL实现视频播放器(1)

通过解码,将压缩编码的视频数据 H.264,MPEG2 解码成为非压缩的颜色数据,例如 YUV 等等;将压缩编码的音频数据 AAC,MP3 解码成为非压缩的音频抽样数据,例如 PCM 数据。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。音视频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的音频和视频数据,并将音视频频数据送至系统的显卡和声卡播放出来(Render)。输出文件的详细信息,包括音视频流的信息。来解析视频文件中的流信息。

2024-08-28 16:36:53 851

原创 Qt+OpenCV实现形态学操作(腐蚀、膨胀、开运算、闭运算)

形态学操作的原理:在特殊领域运算形式——结构元素(Structure Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小很多,二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素进行膨胀或腐蚀操作时是否需要参与计算。

2024-08-01 15:10:49 501

原创 Qt+OpenCV实现图像滤波器

均值滤波:简单但会模糊图像细节,适用于一般平滑。高斯滤波:较复杂,能更好地保留细节和平滑图像,适用于需要平滑和保留边缘的情况。中值滤波:适合去除椒盐噪声,能很好地保留边缘,但对细小细节有模糊效果。根据具体需求,可以选择合适的滤波方法来处理图像。

2024-07-30 18:03:14 999

原创 OpenGL关键词汇

OpenGL: 一个定义了函数布局和输出的图形API的正式规范。 GLAD: 一个扩展加载库,用来为我们加载并设定所有OpenGL函数指针,从而让我们能够使用所有(现代)OpenGL函数。 视口(Viewport): 我们需要渲染的窗口。 图形管线(Graphics Pipeline): 一个顶点在呈现为像素之前经过的全部过程。 着色器(Shader): 一个运行在显卡上的小型程序。很多阶段的图形管道都可以使用自定义的着色器来代替原有的功能。 标准化设备坐标(Normalized Device C

2024-07-29 21:09:50 320

原创 Qt+OpenGL实现“摄像机”

当讨论摄像机(Camera)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。要定义一个摄像机,需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。两个向量叉乘的结果会同时垂直于两向量,因此会得到指向x轴正方向的那个向量(如果交换两个向量叉乘的顺序就会得到相反的指向x轴负方向的向量)。现在已经有了x轴向量和z轴向量,获取一个指向摄像机的正y轴向量就相对简单了:把右向量和方向向量进行叉乘。

2024-07-29 16:32:54 793

原创 Qt+OpenGL实现3D效果

顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。值),当片段想要输出它的颜色时,OpenGL会将它的深度值和z缓冲进行比较,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖。观察实际生活的景象,会注意到离的越远的东西看起来更小。

2024-07-23 22:39:07 1331

原创 Qt+OpenGL实现变换(缩放、位移和旋转)

尽管现在已经知道了如何创建一个物体、着色、加入纹理,给它们一些细节的表现,但因为它们都还是静态的物体,仍是不够有趣。可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动,但这太繁琐了,而且会消耗很多的处理时间。现在有一个更好的解决方案,使用(多个)矩阵(Matrix)对象可以更好的变换(Transform)一个物体。下面是一个2×3矩阵的例子:矩阵可以通过(i, j)进行索引,i是行,j是列,这就是上面的矩阵叫做2×3矩阵的原因(3列2行,也叫做矩阵的维度(Dimension))。

2024-07-23 17:21:09 1071

原创 Qt+OpenGL实现加载纹理

GLSL有一个供纹理对象使用的内建数据类型,叫做采样器(Sampler),它以纹理类型作为后缀,比如Sampler1D、Sampler3D,或在例子中的Sampler2D。使用GLSL内建的texture函数来采样纹理的颜色,它第一个参数是纹理采样器,第二个参数是对应的纹理坐标。这个片段着色器的输出就是纹理的(插值)纹理坐标上的(过滤后的)颜色。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。纹理坐标在x和y轴上,范围为0到1之间(注意使用的是2D纹理图像)。

2024-07-22 11:06:19 454

原创 Qt+OpenGL着色器语言(GLSL)学习

能声明的顶点属性是有上限的,它一般由硬件来决定。GLSL也有两种容器类型,它们会在这个教程中使用很多,分别是向量(Vector)和矩阵(Matrix),其中矩阵之后再讨论。此外,还有几种其他类型的着色器,如几何着色器、计算着色器等,但顶点和片段着色器是最常用的。后缀可以是.x,.y,.z和.w(分别对应于向量的第1, 2, 3, 4个分量),也可以是r,g,b,a(对应于颜色的红、绿、蓝、透明度分量)。GLSL中的向量是一个可以包含有2、3或者4个分量的容器,分量的类型可以是前面默认基础类型的任意一个。

2024-07-17 15:26:36 402

原创 Qt 中用于管理 OpenGL 着色器程序的类——QOpenGLShaderProgram

是 Qt 中用于管理 OpenGL 着色器程序的一个类。它封装了着色器的编译、链接和使用过程,使得 OpenGL 着色器程序的管理更加简单和高效。通过,你可以轻松地创建、使用和管理顶点着色器和片段着色器。

2024-07-17 14:50:06 388

原创 Qt+OpenGL学习笔记-绘制三角形

OpenGL中任何事物都在3D空间中(即X,Y,Z轴),但是屏幕和窗口都是2D像素数组,导致OpenGL大部分工作是将3D坐标转变为适应你屏幕的2D像素,3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的,第二部分是把。

2024-07-16 16:14:53 1094

原创 Qt6.X相较于Qt5.X低版本的改动<QAudioDeviceInfo>类

在 Qt 6.X以上的版本中,QAudioDeviceInfo 类已被移除并且不再使用。取而代之的是新的音频 API。这意味着需要更新代码以适应 Qt 6.X的新 API。解决方案使用 Qt 6.0 中的新 API 替换旧的 QAudioDeviceInfo。

2024-07-10 16:24:02 300

空空如也

空空如也

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

TA关注的人

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