自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux下使用qt+mpv调用GPU硬件解码

linux下GPU硬件解码接口,常用的有vdpau和vaapi。mpv是基于mplayer开发的一个播放器。此外,mpv还提供了函数库libmpv,通过使用libmpv可以编写一个简单的播放器。但是这个默认调用的是软件解码,我们需要基于这个demo稍作修改,就可以让libmpv调用GPU硬件解码VDPAU/VAAPI,下面详细介绍如何操作。

2024-04-19 22:16:46 685

原创 linux下ffmpeg调用GPU硬件解码(VDPAU/VAAPI)保存文件

本文讲解在linux下面,如何通过ffmpeg调用GPU硬件解码,并保存解码完的yuv文件。其实,ffmpeg自带的例子hw_decode.c这个文件,就已经能满足要求了,因此,本文就尝试讲解以下hw_decode这个例子。hw_decode.c可以调用VDPAU硬件解码,也可以调用VAAPI硬件解码,下面依次讲解如何进行操作。

2024-02-18 21:19:09 2028

原创 奇安信浏览器调用JM9硬件解码操作教程

本文讲述如何通过奇安信浏览器调用景嘉微JM9系列显卡的硬件解码。

2023-06-30 15:41:06 1411

原创 rtspplayer播放器实现

本文讲解rtspplayer播放器实现。通过自己写代码,播放网络rtsp码流。rtspplayer 工作过程rtsp播放器的工作过程,如上图所示。具体步骤如下:接收网络数据,得到rtsp码流。我们可以通过ffmpeg或者live555来接收rtsp码流。rtsp解封装,得到h264码流。一般可以利用ffmpeg进行rtsp的解封装。解码h264码流,得到yuv数据。这一步,可以利用ffmpeg里面的软件解码,libx264解码,也可以利用GPU的硬件解码。将yuv数据,转换成rgb数据。这一

2022-01-12 21:11:17 3366 1

原创 libdrm学习-dumb buffer

dumb介绍dumb buffer,一般是指CPU buffer,我们把这个buffer的内容填充,GPU只负责完整显示出来,GPU并不会对dumb buffer做任何加速。关于dumb名字的由来,可以参照下面文章。https://blog.csdn.net/hexiaolong2009/article/details/105961192dumb buffer涉及三个主要操作, create, map, destroy。dumb使用dumb的create, map, destroy,三者都是通过

2022-01-03 20:38:42 1461

原创 libdrm学习-打开关闭设备

最近在学习libdrm库的使用,写点博客记录一下学习过程。先从libdrm设备打开关闭开始。libdrm打开,关闭设备,有对应的函数drmOpen, drmClose。但是我用这个函数,返回的总是0xffffffff。后面我看好多的libdrm的例子,都是直接使用open,close的。这样我的打开,关闭设备的代码如下:#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <x

2022-01-03 19:31:29 1170

原创 OpenGL 3.0贴纹理

OpenGL 3.0 贴纹理1. 把shader程序放置到GPU上2. 把顶点数据传送到GPU上3. 把纹理数据传送到GPU上4. 绘制图形本文讲述如何使用OpenGL 3.0进行贴纹理。分如下4个部分进行:把shader程序放置到GPU上。把顶点数据传给GPU。把纹理数据传给GPU。开始绘制。1. 把shader程序放置到GPU上shader程序分成vertex shader 和 fragment shader,vertex shader程序代码如下:#version 330 cor

2021-07-25 21:16:59 342

原创 OpenGL 缓存对象(Buffer Object) 解析

缓存对象(Buffer Object)简介OpenGL Buffer Object(缓存对象,简写BO),是OpenGL管理的一段内存,为了与我们CPU的内存区分开,一般叫OpenGL管理的内存,叫显存。为了区分内存与显存,我这里从京东上搜索了内存条与显卡,如下图,这是一张显卡的截图,显卡使用的DDR为GDDR5,就是我们的显存,这个2G就表示这个显存的大小为2G。再看内存,内存条,下面的内存条,使用的是DDR4,这里有2根,容量大小为8GB。内存,是通过PCIE插槽,插在主板上的,也就是位于主

2021-04-19 23:21:37 1692

原创 gl3w解析

我在学习《OpenGL编程指南》第9版,第一个例子程序,是画2个三角形triangs,里面用到了gl3w。这里就来解析一下,这个gl3w。gl3w 简介gl3w是用来加载OpenGL核心模式(core profile)的。所谓核心模式,就是OpenGL编写shader程序,需要使用的那些函数, gl3w就是用来加载这些函数的。可以理解成gl3w就是用来加载OpenGL 3.0以后的函数的。gl3w 组成gl3w,就2个文件组成,一个gl3w.h和一个gl3w.c文件。实际使用的时候,可以把gl3w.

2021-04-18 20:34:06 1298 1

原创 GLFW的hello world

最近在学opengl,使用的《OpenGL编程指南》第9版,其中第一个例子,就是基于glfw库创建的,所以先了解一下glfw这个库,对于后续OpenGL开发是有帮助的。GLFW 简介GLFW 是一个开源的,跨平台的库,可以用于桌面环境的OpenGL, OpenGL ES和Vulkan开发。它提供了简单的API,用来创建窗口,上下文和Surface,接收输入和事件。GLFW是用c语言编写的,支持Windows, macOS, X11和Wayland。以上翻译自glfw官网,想了解更多的,请移步到该网址

2021-04-18 11:15:45 243

原创 linux下使用ffmpeg采集摄像头数据并编码成h264文件

本文讲述如何在linux下,使用ffmpeg采集视频数据,并编码成h264文件。打算分成3部分讲解:需要具备的软硬件环境ffmpeg命令采集摄像头数据并编码成h264文件ffmpeg代码采集摄像头数据并编码成h264文件需要具备的软硬件环境需要具备的硬件环境,摄像头。我这里是一个usb 摄像头。需要具备的软件环境,ffmpeg,并且启用了libx264编码的ffmpeg。假如是自己编译的ffmpeg,在configure 的时候,需要添加上参数“–enable-libx264”,我在这中间

2021-03-22 22:39:15 7154 7

原创 ffmpeg 采集摄像头yuv数据

本文讲述在linux下,如何使用ffmpeg采集摄像头yuv数据,并保存为文件。分为3个部分进行讲解需要的软硬件环境使用ffmpeg命令采集yuv数据。使用ffmpeg代码采集yuv数据。需要的软硬件环境使用ffmpeg采集摄像头数据,需要具备两个条件:首先,需要有一个摄像头。我这里使用的是USB摄像头,直接插在电脑主机之后。其次,需要安装了ffmpeg。我这里是自己编译的ffmpeg。使用ffmpeg命令采集yuv数据首先,我们需要知道摄像头的位置。在linux下面,摄像头抽象成了

2021-03-21 16:40:06 3963 3

原创 Unknown encoder ‘libfdk_aac‘解决办法

问题背景最近在linux上学习使用ffmpeg,想使用ffmpeg来录制音频。一般音频使用的是aac编码,据说libfdk_aac比ffmpeg默认的aac编码器要好,尝试使用libfdk_aac编码器来进行编码。我的ffmpeg是通过apt install ffmpeg的方式来进行安装的。默认没有启用libfdk_aac。那么我尝试自己编译ffmpeg试试。问题解决过程先尝试自己编译ffmpeg,那么需要先安装libfdk_aac对应的依赖项。我这里,宁可多装,也不要少装,所以把几个和fdk,

2021-03-21 11:15:43 4994

原创 linux下使用ffmpeg采集音频数据

本文讲解如何在linux下面采集音频数据,分成3部分讲解。采集音频所需的软硬件环境。如何使用ffmpeg命令采集音频。如何使用ffmpeg代码采集音频。软硬件环境使用ffmpeg来采集音频数据,主要需要2个软硬件环境:硬件环境,需要有一个录音设备,我这里使用的是麦克风,并且插入了机箱后面的粉色圆孔中(绿色圆孔是耳机/喇叭的接口)。软件环境,需要安装ffmpeg。可以使用软件源中编译好的ffmpeg,也可以自己编译安装ffmpeg。这两个环境具备了,本文后面内容才具备可行性。使用

2021-03-20 23:12:57 4878 6

原创 gstreamer没有找到 plugin和audiofilterexample

gstreamer加载插件失败问题背景问题原因问题解决问题背景按照网上教程,自己编译了gstreamer, gstreamer-plugin-base, bad, good, ugly,全都用的默认的./configure, make, make install。然后想自己编译插件,把自己的插件加入到gstreamer中去。从网上下载了gst-template,然后里面有2个插件例子:pl...

2019-03-28 21:47:56 830 3

原创 QFileSystemModel只显示名称,不显示size,type,modified

Qt 提供的 QFileSystemModel可以提供文件目录树预览功能,但是预览的都自带了Name,size,type, modified等信息。我现在只想显示name这一列,不想显示size,type,modified的信息。解决办法写一个子类,继承自QFileSystemModel,然后在需要显示size,type,modified的地方,把这些信息屏蔽掉。我知道Qt的Model显示数据,主要

2017-07-17 16:13:14 3331

原创 Linux上Qt程序闪退的BUG

问题现象输出信息[xcb] Unknown request in queue while dequeuing [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry about that问题背景我把一个Qt的Windows程序,移植到L

2017-07-10 15:17:31 5454

原创 Linux 上Qt读取中文文件路径问题

最近在搞跨平台的事,把一个应用程序,从Windows,移植到Linux,使用的是Qt。但是遇到一个问题,QFile::exists文件,老是返回false,我已经确定文件在目录下存在,后来是这么解决的。 1. 把cpp文件的编码,转成UTF-8。原来为GBK/Windows…编码。这个步骤是大家容易忘记的!!! 2. setCodecForLocale,为UTF-8。 3. 调用函数时,使用Q

2017-05-12 16:55:07 4793 1

原创 三个线程顺序打印ABC

我通过使用OpenThreads库的BlockCount类,实现顺序打印ABC,代码如下。#include <OpenThreads/Thread>#include <OpenThreads/Block>#include <string>#include <iostream>#include <vector>class PrintThread : public OpenThreads::Th

2017-05-04 22:47:39 1401

原创 OSG中的材质Material

材质概念材质,反应的是物体表面对入射光的反射量。发亮的材质,反射更多的入射光。发暗的材质,吸收更多的入射光。对于透明的表面,一些入射光穿透了材质。OSG中对材质的处理OSG中,通过osg::Material这个类,来对OpenGL的glMaterial进行了封装。Material主要用到四种颜色模式:1. 环境光 AMBIENT2. 漫反射 DIFFUSE3. 镜面光 SPECULAR4.

2017-05-01 15:59:38 5332 1

原创 CMake学习-添加头文件路径,库路径,库

CMake中,添加头文件路径,对应的函数叫include_directories。然后在参数中,把所有需要添加的路径,加进去就可以了。添加库路径,对应的函数叫LINK_DIRECTORIES,同样,在参数中,把所有的路径加进去就可以了。CMake中的函数调用,是不区分大小写的,大小写可以混合使用。添加库,对应的函数叫LINK_LIBRARIES,把所有的库加进去即可。这里有一个注意事项,这个不需要我

2017-04-19 11:24:53 68939

原创 CMake学习-添加exe程序

CMake中添加exe程序,需要使用到函数add_executable。这个函数的第一个参数,是exe程序的名称,后面的参数,是添加到这个exe中的源码文件名称。HelloWorld的编写如下所示,添加一个HelloWorld程序。 其中CMakeLists.txt的文件内容如下:project (Hello)add_executable(HelloWorld HelloWorld.cpp)

2017-04-19 10:32:52 2254

原创 OSG设置半透明显示

OSG设置半透明显示,需要设置显示颜色的alpha值小于1,且开启融合模式,设置渲染方式为透明方式。osg::Geometry* polyGeom = new osg::Geometry();//颜色为半透明颜色osg::ref_ptr<osg::Vec4Array> shared_colors = new osg::Vec4Array;shared_colors->push_back(osg

2017-04-12 21:57:03 3601

原创 OpenThreads使用-BlockCount

BlockCount简介BlockCount,障碍物个数。 之前通过一个Block可以阻塞线程。但是当一个线程,需要多个条件都满足时,才能继续运行。这怎么办呢?这个BlockCount就是用来干这个的。BlockCount使用BlockCount的使用,和Block类似。阻塞线程,使用block函数。释放线程,使用release函数。但是比Block多出来的功能是,使用completed函数,表示

2017-04-09 17:17:06 976

原创 OpenThreads使用-Block

Block简介Block,障碍物,阻塞。 通过Block对线程进行阻塞,然后释放障碍物,使得线程继续运行。Block使用Block的使用,通过调用block函数,阻塞调用线程。然后通过release函数,释放所有被这个Block阻塞的线程。 下面这个程序,开启A,B线程,去售票,然后主线程自己阻塞。当A卖完10张票以后,释放Block,主线程继续运行,去开启C线程售票。同时A阻塞自己,停止售票。

2017-04-09 16:24:41 916

原创 OpenThreads使用-Barrier

Barrier简介Barrier,栅栏。 栅栏,用来阻挡线程。栅栏有个栅栏强度,为一个数值,当被阻挡的线程达到栅栏强度时,栅栏被冲破,所有被栅栏阻挡的线程运行。Barrier使用Barrier的使用,也比较简单,哪个线程调用Barrier的block函数,哪个线程就被阻挡在栅栏外。当栅栏被冲破之后,又自动恢复栅栏,继续阻挡下一次前来的线程。#include <OpenThreads/Thread>

2017-04-09 15:14:26 1905 1

原创 OpenThreads库的使用-Condition

Condition简介Condition,条件变量。当条件没达到时,线程阻塞。当条件达到时,线程运行。 OpenThreads库的Condition,需要依赖Mutex才能运行。条件没达到时,调用Condition的wait函数,去等待条件。条件达到时,调用Condition的signal放行一个线程,或者broadcast放行所有线程。Condition使用下面程序,表示A,B,C三个售票员分别

2017-04-09 14:35:20 2803

原创 OpenThreads库的使用-Atomic

Atomic简介Atomic,原子操作。 所谓原子操作,就是指这个操作,要么不执行,要么全部执行完,中间不允许被别人打断。 OpenThread库中的Atomic,表达的是一个无符号整形数,但是这个数的操作是原子性的。这样,即使有多个线程对它进行操作,还是可以确保这个操作的正确性。Atomic使用Atomic的使用,和一个正常的无符号整数的使用方式类似。先定义,然后通过前缀++,或者–操作符,来

2017-04-09 10:55:25 1271

原创 OpenThreads库的使用-Mutex

Mutex是什么Mutex,叫互斥锁。 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。为什么使用Mutex因为线程存在并发性,并发容易导致问题。举个例子:A,B两个售票员,看到最后还有一张车票。同时,正好有C,D两个人要买这张车票。那么这个车票怎么卖?A认为可以卖给C,B认为可以卖

2017-04-09 10:13:35 1977 1

原创 OpenThreads库的使用-Thread

Thread简介OpenThread库,提供了一个Thread类,供用户创建自己的线程。其使用非常方便,用户只需要继承自OpenThreads::Thread类,然后自己重写run接口即可。Thread程序示例下面程序,使用一个线程,去卖票。g_ticketCounts表示当前可用的票的数量。#include <OpenThreads/Thread>#include <iostream>int g

2017-04-09 08:04:20 5917 2

原创 非Qt工程使用Qt的信号槽机制

非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事。要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍:All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also

2015-09-21 21:56:59 1552

原创 OSG中的粒子系统

OSG中提供了粒子系统,可以实现雨雪效果。本文提供OSG中的粒子系统的基本使用。源代码#include <osgViewer/Viewer>#include <osg/Geode>#include <osgParticle/ParticleSystem>#include <osgParticle/ParticleSystemUpdater>#include <osgParticle/Modu

2015-08-03 22:02:33 2657

原创 OSG中LOD的使用

LOD概念LOD是Level Of Detail 的缩写,LOD允许程序根据摄像机与物体的距离,来决定使用哪个模型。为什么要使用LOD使用LOD是为了兼顾程序的运行效率与物体显示的精细程度。当物体离摄像机很远的时候,物体看起来就是一个点,这时候你使用再精细的模型,最终屏幕上成像也是一个点。而你用的模型越精细,计算机内部需要的计算量越大。所以当物体离相机远的时候,使用粗略模型,当物体离相机近的时候,使

2015-07-11 23:14:39 8812 6

原创 C语言中的二维数组与指针

本文主要解释这个问题,如下代码中,打印出来的值a+1和*(a+1)是一样的。#include <stdio.h>void main(){ int a[2][3]={ 1, 3, 5, 7, 9, 11 }; printf("%d\n", a);//整个数组的首地址 printf("%d\n", *a);//数组第一行元素的首地址

2015-05-28 22:25:18 708

原创 VBO的使用

VBO的定义VBO,全称Vertex Buffer Object,中文名叫顶点缓冲区对象,是位于显卡中的一块内存区,这个内存区存放的是顶点相关的数据,比如坐标、颜色、法向量等。相关概念Buffer Object,缓冲区对象,即显卡中的一块内存区。这个内存区可以存放不同的东西,当存放顶点相关的数据时,就是上面的顶点缓冲区对象VBO。当这个内存区存放Uniform变量的时候,就叫统一缓冲区对象(Unif

2015-05-26 06:39:20 1125

原创 4.2 计算机颜色

颜色的显示显示器通过在每个像素上,发射不同数量的红、绿和蓝光,从而形成颜色。颜色的存储颜色的存储,可以按照两种模型进行,RGBA模式和颜色索引模式。在RGBA模式下,每个像素分别保存一个R,G,B值,并可能保存一个A值。在颜色索引模式下,每个像素存储一个表示颜色序号的数值(称为颜色索引)。每个颜色索引表示颜色表中一个特定的项。颜色表定义了一组特定的R,G,B值,称为颜色映射表。颜色缓冲区用于存储所有

2015-03-26 19:46:20 467

原创 4.1 颜色感知

进入第4章的学习。这一章,主要讲颜色,内容比较少。OpenGL中的颜色模式分为两种,RGBA模式和颜色索引模式。RGBA模式,是指将颜色分成4种成分,RGBA,分别为red, green, blue, alpha,通过这四种成分的强度,然后进行混合,就得到了各种各样的颜色。颜色索引模式,是指事先配置好颜色,当需要使用该颜色时,通过索引去访问该颜色。有点类似于调色板,在各个方格中,配置好颜色,要访问某

2015-03-26 19:17:31 709

原创 3.9 逆变换和模拟变换

逆变换,就是OpenGL变换的逆过程。OpenGL是将三维坐标,转换成屏幕坐标。而逆变换,就是将屏幕坐标,转换为三维坐标。在逆变换过程中,同样需要正变换中的那些参数,这些参数有三个: 模型矩阵, 投影矩阵,视口。逆变换,使用的函数叫gluUnProject,这个是相对于标准深度值的。还有一个函数,叫gluUnProject4,是相对于非标准深度值的。所谓标准深度值,是指深度值范围为[0, 1]。深度

2015-03-25 20:45:22 668

原创 3.8 一些组合变换的例子

这一小节主要是两个例子:创建太阳系模型,创建机器人手臂。 这两个例子,主要用来讲解如何对视图模型进行变换。3.8.1 创建太阳系模型/** planet.c* This program shows how to composite modeling transformations* to draw translated and rotated models.* Interactio

2015-03-25 20:09:07 902

原创 3.7 其他裁剪平面

之前了解到,OpenGL的视景体定义了一个裁剪区域,只有区域内的物体,才可见。OpenGL除了视景体可以裁剪外,还可以自己定义裁剪平面,对物体进行裁剪。裁剪平面如何表示呢?通过一个方程:Ax + By + Cz + D = 0,然后我们只需要指定A,B,C,D的值,就可以表示一个平面了。裁剪平面有多少个呢?所有OpenGL的实现,都必须支持至少6个其他的裁剪平面,有些实现可能允许超过6个的其他裁剪平

2015-03-24 20:51:32 401

空空如也

空空如也

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

TA关注的人

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