使用QT + OpenGL + FFmpeg实现视频播放

      基本的工作原理:首先通过FFmpeg获取视频,可以是通过摄像头,文件,截屏等。然后利用QT中的OpenGL组件显示视频。主要的工作是利用着色器进行视频格式转换,因为获取到的视频格式一般是YUV格式,显示到显示器上的一般是RGB格式。这里的代码只实现了YUV422格式的转换,其他格式类似。        下面是视频获取类VideoSource.h头文件: #pragma once extern “C” { #include “libavcodec/avcodec.h” #include “libavformat/a […]

如何在ios使用opengl

       在MAC OS 和 IOS 中使用opengl有两种方式:一种是直接继承OpenGL View,需要用到GLKit;另一种是自定义UIView,这需要用到CAEAGLLayer,其实每个UIView可以拥有多个Layer。下面的例子是使用自定义UIView。 OpenGLView.h文件: #ifndef OpenGL_View_h #define OpenGL_View_h @interface OpenGLView : UIView – (void)swapBuffer; @end #endif /* OpenGLView.h */ O […]

在mac系统中使用AudioQueue播放音频数据

        在MAC中使用AudioQueue可以很方便的播放音频数据。音频的数据格式可以通过AudioStreamBasicDescription来设置。 dhsAudioQueue.h文件: #ifndef dhsAudioQueue_h #define dhsAudioQueue_h @interface dhsAudioQueue : NSObject – (void)configureAudioQueue; – (void)startPlayWithDataProvider:(DataProvider*)dataProvider; – (v […]

FFmpegPtr – FFmpeg的智能指针

FFmpeg是纯C语法的,内部结构体内存分配和释放需要调用专门的函数,比如avformat_alloc_context,avformat_free_context等。使用起来不太方便,如果调用的时候忘记了一一对应的,很容易造成内存泄漏。 因此用C++的模板把ffmpeg中的内存分配进行了封装。下面的例子只是对AVFormatContext, AVCodecContext进行了封装,其他结构体封装起来也很方便,只需重载FFmpegPtrTraits类就可以。 template<typename T> class FFmpegPtrTraits; template& […]

cuda与OpenGL和DirectX的图形交互

OpenGL和Direct3D中的资源可以被映射到cuda的内存空间,以允许cuda读取,也允许cuda写入后供OpenGL和Direct3D使用。 在映射之前,需要对资源进行注册(register),会得到一个cudaGraphicsResource的指针。使用完成后,需要通过cudaGraphicsUnregisterResource注销资源。 一旦资源注册成功,就可以对资源进行映射cudaGraphicsMapResources和取消映射cudaGraphicsUnmapResource,映射可以根据需要是多次的。映射后的内存,可以被内核函数使用,通过cudaGraphicsResour […]

使用Direct3D 11 Video API播放视频

        最近看了下微软的Media Foundation,发现Media Foundation里面的EVR使用比较旧的Direct3D API,于是想直接使用Direct3D 11 Video API来播放视频。并且可以在视频上添加图片和显示文字,又不想使用Media Foundation的pipeline。视频采集利用Media Foundation 的source reader,或者使用ffMpeg获取视频,然后直接通过Direct3D 11/12 Video A […]

cuda中的异步并行执行

cuda可以让不互相依赖的任务进行并行操作,主要任务包括如下: 主机端的计算 设备端的计算 主机到设备端的内存数据传输 设备到主机端的内存数据传输 设备内的内存之间的数据传输 设备到设备之间的数据传输   在主机和设备间可以并行执行的操作有: 内核函数执行 单个设备内存间的数据拷贝 主机到设备的内存拷贝,内存块的大小,小于64KB。 以async为前缀的内存拷贝函数 memory set function calls 并行执行的特性,可以查询设备的属性,查看是否支持。 cudaDeviceProp.asyncEngineCount > 0    // 支持c […]

cuda 纹理(texture)和表面(surface)的使用

       cuda纹理和表面内存是一种特殊的全局内存,主要针对二维空间的局部性访问进行了优化。纹理内存是只读的,而表面内存是可读可写的。纹理和表面内存都支持一维、二维和三维。        纹理内存的属性: read mode用来指定返回值是归一化模式,还是原始值模式。如果是cudaReadModeNormalizedFloat,则返回[0.0 1.0]之间的浮点数;如果是cudaReadModeElementType,则返回原始值。 addressing mode指定寻址模式,也就是超出坐标范围值如果取值。有 […]

访问者模式 – 让数据存储和数据访问分离

有时候需要将数据的存储和访问分别放到不同对象中,这时就可以使用访问者模式: class MultiThreadVector { std::vector<int> mArray; std::mutex mMtx; public: class Accessor { MultiThreadVector &mData; std::unique_lock<std::mutex> mGuard; public: Accessor(MultiThreadVector &data) : mData(data), mGuard(data.mMtx) { } void pu […]

在visual studio中添加cuda编译选项

1. 创建存放cuda代码的筛选器, 2. 在筛选器中添加cuda源码文件 3. 右击项目—->“生成自定义”,在弹出的窗口中勾选cuda的对应版本。 4. 修改cuda文件的编译链接设置,右击cuda源文件—–>“属性”,在弹出窗口中—->“常规”—->”项类型“的下拉列表中选择点击”应用“后,”常规“下方会出现一个”cuda c/c++”的设置。 5. 修改工程设置,“链接器”—>”输入”—>”附加依赖项&#82 […]